SDL2.0扩展库:SDL_image
好文章,来自【福优学苑@音视频+流媒体】
SDL2.0扩展库:SDL_image
我们SDL默认支持的,只能打开BMP格式的图片。
然而我们常见的是Png jpg格式的图片,于是我们这节完成SDL借用自带的三方库,来完成加载渲染png等其他图片格式。
SDL_image简介
使用SDL_image,您可以加载流行的图像格式,如BMP,PNM(PPM / PGM / PBM),XPM,LBM,PCX,GIF,JPEG,PNG,TGA和TIFF格式。 这些被加载到你的SDL_Surface上,并且正常地画在屏幕上。同时, 支持Alpha透明度,比如加载PNG图片。
SDL2.0扩展库——SDL_image的添加
首先,安装前面的配置,有一个基本的SDL2.0开发工程,在这个基础上添加SDL_image扩展库。
下载地址:https://www.libsdl.org/projects/SDL_image/
.还是在windows上,用vs编辑器,下载对应的开发包:
解压出来是这样:
include文件夹里只有一个SDL_image.h
lib中分x64和x86,也就是64位,还是32位。
x32的文件夹里也是这样。
配置和SDL2.0开发环境配置一样,里面包括了include、lib、dll三个部分,将对应平台的这三部分添加到工程配置里。
完整代码如下:
#include <string> #include <iostream> using namespace std; ///坑1:c++调用C函数时需要用extern; 我们是c++,SDL库是C语言文件 extern "C"{ #include "SDL.h" #include "SDL_image.h" } /// 坑2:添加 附加依赖项,SDL2.lib /// 链接器-->输入-->附加依赖项 /// 坑3: SDL本身已经定义了main函数。 #undef main /// 坑4:运行,找不到sdl2.dll //////////////////////////// 1.初始化 2.创建窗口:CreateWindow 3.创建 渲染器(window) 4.加载 图片(“path”)(IMG_XXX-->Init, Load, Quit) 5.创建 纹理(render, bmp) 6.复制 纹理 到 渲染器RenderCopy 7.刷新 渲染器(RenderPresent) 8.退出(释放、清理) //////////////////////////// int main_show_png() { bool quit = false; SDL_Event event; //SDL初始化,这里只显示图片,所以只初始化VIDEO系统,更多的支持查看官方文档 SDL_Init(SDL_INIT_VIDEO); //为了显示png图片,额外使用了图片库,所以要单独初始化 IMG_Init(IMG_INIT_JPG); //建立SDL窗口 SDL_Window * window = SDL_CreateWindow("SDL2 Displaying Image", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); //渲染层 SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0); //如果只是显示一张bmp图片,使用sdl内置的功能即可 //SDL_Surface * image = SDL_LoadBMP("only_support_BMP.bmp"); //因为要显示png图片,所以使用了外部库,sdl_image库当前支持jpg/png/webp/tiff图片格式 SDL_Surface * image = IMG_Load("Hello_world.png"); //载入的图片生成SDL贴图材质 SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, image); while (!quit) {//主消息循环 SDL_WaitEvent(&event); switch (event.type) {//用户从菜单要求退出程序 case SDL_QUIT: quit = true; break; } //如果指定显示位置使用下面注释起来的两句 //SDL_Rect dstrect = { 5, 5, 320, 240 }; //SDL_RenderCopy(renderer, texture, NULL, &dstrect); //把贴图材质复制到渲染器 SDL_RenderCopy(renderer, texture, NULL, NULL); //显示出来 SDL_RenderPresent(renderer); } //典型的三明治结构,清理各项资源 SDL_DestroyTexture(texture); SDL_FreeSurface(image); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); //退出image库 IMG_Quit(); //退出SDL SDL_Quit(); return 0; }
***【在线视频教程】***