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图片。


image.png


SDL2.0扩展库——SDL_image的添加

首先,安装前面的配置,有一个基本的SDL2.0开发工程,在这个基础上添加SDL_image扩展库。


下载地址:https://www.libsdl.org/projects/SDL_image/


.还是在windows上,用vs编辑器,下载对应的开发包:


image.png


解压出来是这样:


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;
}


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***