SDL2学习(一): 显示一张图片
SDL是一个跨平台的多媒体库,它通过OpenGL和2D视频帧缓冲,提供了针对音频、视频、键盘、鼠标、控制杆及3D硬件的低级别的访问接口。这里使用较新的SDL2库。
1. 配置SDL开发环境
1.1 下载SDL开发库
下载地址:http://www.libsdl.org/download-2.0.php;选择SDL2-devel-2.0.10-VC.zip。解压后的目录如下:

1.2 配置环境
使用VS新建一个C++控制台工程,并做如下配置:
- 将解压后的SDK库拷贝到工程目录下,然后配置VS工程;
- "C/C++"-->"常规"-->"附加包目录",填入SDL的相对include目录;

- "链接器"-->"常规"-->"附加库目录",填入SDL的相对lib目录。

- "C++"-->"代码生成"-->"运行库",选择"多线程 DLL(/MD)"

- "链接器"-->"系统"-->"子系统"更改为"窗口"

- 最后,为了不每次都需要将dll拷贝到exe所在目录,配置"调试"-->"环境",设置为"PATH=sdl/lib/x86;%PATH%",但是要注意如果是直接运行exe,还需要将对应的dll拷贝到和exe一起。
2. 编写代码实现
首先,通过以下代码验证SDL配置成功:
#include "SDL.h"
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")
int main(int argc, char* args[])
{
//启动SDL
SDL_Init(SDL_INIT_EVERYTHING);
//退出SDL
SDL_Quit();
return 0;
}
使用SDL2需要注意几点:
- 和sdl 1.x版本有些接口差别较大,不能直接套用;
- 没有对SDL进行初始化,则无法调用任何SDL函数;
- 退出前注意释放资源。
下面是使用SDL2显示一张bmp图片的代码:
#include "SDL.h"
#include <iostream>
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")
int main(int argc, char* args[])
{
//窗口含有的surface
SDL_Surface* screenSurface = NULL;
//初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
}
else {
//创建 window
SDL_Window *window = SDL_CreateWindow("ShowPicture", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
if (window == NULL)
{
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
}
else {
//渲染层
SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);
SDL_Surface *pic = SDL_LoadBMP("sdl_test.bmp");
//载入的图片生成SDL材质
SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, pic);
//把材质复制到渲染器
SDL_RenderCopy(renderer, texture, NULL, NULL);
//显示出来
SDL_RenderPresent(renderer);
bool quit = false;
SDL_Event event;
while (!quit)
{//主消息循环
SDL_WaitEvent(&event);
switch (event.type)
{
//用户从菜单要求退出程序
case SDL_QUIT:
quit = true;
break;
}
}
// 清理资源
SDL_DestroyTexture(texture);
SDL_FreeSurface(pic);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
}
}
//退出SDL
SDL_Quit();
return 0;
}

如果要显示jpg等其他格式的图片,需要引入image库(同样要下载sdl2_image库):
//引入image库
IMG_Init(IMG_INIT_JPG);
SDL_Surface * image = IMG_Load("*.png");
//退出image库
IMG_Quit();
如果需要指定图片的渲染位置,可以这样实现:
SDL_Rect dstrect = { 5, 5, 320, 240 };
SDL_RenderCopy(renderer, texture, NULL, &dstrect);
SDL_RenderPresent(renderer);
总体流程:
SDL2学习(一): 显示一张图片的更多相关文章
- 仿AS语法来写HTML5—第1章,显示一张图片
最近开始学习html5,因为一直都是研究as,所以还是觉得as顺眼一点,但是html5也不能不学,于是就想出了,可以把html5用as的语法来写出来,做游戏应该来的比较顺手一些,下面开始第一篇 第一篇 ...
- Python+OpenCV图像处理(一)——读取显示一张图片
先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...
- @Html.Raw显示一张图片
在ASP.NET MVC中,显示一张图片,是很方便的事情,完全可以在控制器中组合html代码,并传给视图. 下面一个简单的例子: public ActionResult HtmlRawImage() ...
- swiper轮播问题之二:默认显示3张图片,中间显示全部两边显示部分
其二:项目遇到比较有点要求的轮播图,默认显示3张图片,中间显示全部,两边显示部分.如图: 网上找了也没有找到合适的,最后经过自己摸索写了出来,贴出代码分享给大家. CSS .swipe ...
- 使用Fresco实现简单的显示一张图片
使用Fresco实现显示一张图片 仅仅是下载一张图片,在下载完之前,先显示一张站位图 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/de ...
- OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量
使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...
- opencv实例一:显示一张图片
第一个简单的实例,显示一张图片: 1)代码如下 /*************************************************************************** ...
- 用仿ActionScript的语法来编写html5——第一篇,显示一张图片
第一篇,显示一张图片 一,代码对比 as代码: public var loader:Loader; public function loadimg():void{ loader = new Loade ...
- matplotlib 显示两张图片,折线图 和 scipy
显示两张图片的代码: import numpy as np from scipy.misc import imread, imsave, imresize import matplotlib.pypl ...
随机推荐
- 【cf1111】C. Creative Snap (dfs+dp)
传送门 简单的dfs+dp即可解决.根本不用动态开点 /* * Author: heyuhhh * Created Time: 2019/11/13 10:12:42 */ #include < ...
- 初学JavaScript正则表达式(十一)
JavaScript的对象属性 整理自慕课网教学 点此进入
- 鲜贝7.3--python安装
方法一:google 搜索 anaconda 进入官网下载64位最新版本 勾选加入环境变量 +默认3.7 打开cmd pip 发现已经完成安装 右键此电脑 属性 高级属性 环境变量 ’ 已经被加入 方 ...
- luoguP4585 [FJOI2015]火星商店问题
题意 显然商店编号的限制能用可持久化trie解决. 特殊的商品预先判掉就好了,现在只考虑普通的商品. 发现商品的时间是单点,询问时一段时间,于是将询问区间在线段树上拆成\(log\)个区间,分别放上该 ...
- [PHP] 再续 Laravel 5.5 接口 跨域问题 【终极暴力解决办法】
上文中提到 Laravel5.5 使用 laravel-cors 实现 Laravel 的跨域配置 用插件来跨域 此方法能解决一部分api 请求问题 但我碰到的是 接口 请求size 超过10k,导致 ...
- 【CF525E】Anya and Cubes(meet in middle)
点此看题面 大致题意: 在\(n\)个数中选任意个数,并使其中至多\(k\)个数\(x_i\)变为\(x_i!\),求使这些数和为\(S\)的方案数. \(meet\ in\ middle\) 这应该 ...
- Paper | Feedback Networks
目录 读后总结 动机 故事 ConvLSTM图像分类网络 损失函数 与Episodic Curriculum Learning的结合 实验方法 发表在2017年CVPR. 读后总结 这篇论文旨在说明: ...
- idea安装破解一条龙
1.官网下载2018.2月版本.(other version->选中2018.2) 2.下载JetbrainsCrack_jb51.rar http://wangshuo.jb51.net:81 ...
- AOP软件设计
什么是面向方面的编程? 为什么面向方面的软件设计? 术语 关注 视口 关注点分离 人工制品 横切 方面 编织 零件 形式主义 第二节 案例研究 关注 人工制品 横切 方面 AspectJ 加入点 切入 ...
- 容器网络插件那么多,博云为什么基于OVS深度自研?
背景 从2015年开始,博云开始基于Kubernetes和容器帮助客户交付应用管理平台.在开始阶段,博云选择了业界使用度非常广泛且成熟稳定的calico作为默认的网络方案并在calico方面积累了大量 ...