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学习(一): 显示一张图片的更多相关文章

  1. 仿AS语法来写HTML5—第1章,显示一张图片

    最近开始学习html5,因为一直都是研究as,所以还是觉得as顺眼一点,但是html5也不能不学,于是就想出了,可以把html5用as的语法来写出来,做游戏应该来的比较顺手一些,下面开始第一篇 第一篇 ...

  2. Python+OpenCV图像处理(一)——读取显示一张图片

    先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...

  3. @Html.Raw显示一张图片

    在ASP.NET MVC中,显示一张图片,是很方便的事情,完全可以在控制器中组合html代码,并传给视图. 下面一个简单的例子: public ActionResult HtmlRawImage() ...

  4. swiper轮播问题之二:默认显示3张图片,中间显示全部两边显示部分

    其二:项目遇到比较有点要求的轮播图,默认显示3张图片,中间显示全部,两边显示部分.如图: 网上找了也没有找到合适的,最后经过自己摸索写了出来,贴出代码分享给大家.         CSS .swipe ...

  5. 使用Fresco实现简单的显示一张图片

    使用Fresco实现显示一张图片 仅仅是下载一张图片,在下载完之前,先显示一张站位图 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/de ...

  6. OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量

    使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...

  7. opencv实例一:显示一张图片

    第一个简单的实例,显示一张图片: 1)代码如下 /*************************************************************************** ...

  8. 用仿ActionScript的语法来编写html5——第一篇,显示一张图片

    第一篇,显示一张图片 一,代码对比 as代码: public var loader:Loader; public function loadimg():void{ loader = new Loade ...

  9. matplotlib 显示两张图片,折线图 和 scipy

    显示两张图片的代码: import numpy as np from scipy.misc import imread, imsave, imresize import matplotlib.pypl ...

随机推荐

  1. jmeter判断请求响应时间,请求下加‘断言持续时间’,添加监听器断言结果;统计超时

  2. Html学习之十一(CSS选择器的应用一)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 配置Ngnix1.15.11+php5.4出现502 Bad Gateway问题

    今天在调试Ngnix1.15.11+php5.4网站时候,因为网站数据和并发过大,出现502 Bad Gateway问题,所以记下笔记. 只需要修改php-fpm.conf的request_termi ...

  4. monkey事件

    一.操作事件简介 monkey所操作的随机事件流中包含11大事件,分别是触摸事件.手势事件.二指缩放事件.轨迹球事件.屏幕旋转事件.基本导航事件.主要导航事件.系统按键事件.启动activity事件. ...

  5. Ubuntu环境下打开Firefox报错: Firefox is already running, but is not responding.

    在ubuntu下启动firefox可能会报错 Firefox is already running, but is not responding. To open a new window, you ...

  6. 零基础入门 实战mpvue2.0多端小程序框架

    第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...

  7. 002Excel冻结窗口(冻结第二行)

    不知道是最近状态不好还是怎么回事Excel冻结前面两行居然弄了很久,而工作上又急需,为此还是记录一下 其实超级简单(不会的话就很难) 如果冻结一行 这个非常简单 那么冻结前面两行呢?我研究了很久,其实 ...

  8. 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)

    打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...

  9. 校园邮箱注册jetbrains全家桶遇到的问题

    校园邮箱怎么注册jetbrains账号,百度就可以,发两次邮件 我遇到的问题: 1.登录时出现connection refused 因为之前都是破解使用,所以修改过hosts文件,添加了“0.0.0. ...

  10. MySQL实战45讲学习笔记:第二十五讲

    一.引子 在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行. 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被 ...