1.简介
在SDL中,本身只支持加载BMP格式的图片SDL_LoadBMP,如果想要加载别的格式图片,需要编译SDL_image库。
SDL_image库中IMG_Load和都是IMG_LoadTexture用于加载图片的函数,但是它们的使用方式和返回值有所不同。
IMG_Load和IMG_LoadTexture区别:
- IMG_Load返回一个指向加载后的 SDL_Surface 结构的指针,IMG_LoadTexture返回的是SDL_Texture指针。
- IMG_LoadTexture加载后的图像数据直接存储在GPU显存中,因此能够更快地在屏幕上渲染。这对于实时渲染效果更好的应用程序(如游戏)非常有用。
- IMG_Load函数返回的是一个SDL表面对象指针,需要使用SDL_FreeSurface函数释放内存,IMG_LoadTexture函数返回的是一个SDL纹理对象指针,需要使用函数SDL_DestroyTexture释放内存。
总之,如果您只需要加载图片并将其作为普通表面使用,可以选择 IMG_Load。但如果您需要在游戏中实时渲染图片,例如滚动、缩放或切割,那么使用 IMG_LoadTexture 会更方便。
2.SDL_image编译
下载源码:GitHub - libsdl-org/SDL_image at SDL2
首先编译SDL库:SDL2 简单介绍以及Windows开发环境搭建-CSDN博客
使用CMake,指定编译好的SDL2的库路径和include路径。
然后,打开VS直接编译就行了,编译好生成库如下图所示。
3.配置环境
先拷贝SDL_image的头文件和库文件到目的目录下,如下图所示:
VS的配置请看SDL2 简单介绍以及Windows开发环境搭建-CSDN博客
目录4.配置,跟配置SDL库一样的配置。
4.示例
IMG_Load代码示例:
#include <iostream>
#include <SDL.h>
#include <SDL_image.h>
#undef main
int main()
{
SDL_Window *window = SDL_CreateWindow("demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
// 得到 SDL_Window 的 SDL_Surface
SDL_Surface *pWindowSurface = SDL_GetWindowSurface(window);
//向渲染区域涂成白色
SDL_FillRect(pWindowSurface, NULL,
SDL_MapRGB(pWindowSurface->format, 0xFF, 0xFF, 0xFF));
// 根据图片创建一个 SDL_Surface
SDL_Surface *pImageSurface = IMG_Load("D:/2.png");
bool bQuit = false;
SDL_Event windowEvent;
while (!bQuit) {
while (SDL_PollEvent(&windowEvent)){
switch (windowEvent.type){
case SDL_QUIT:
bQuit = true;
break;
default:
break;
}
}
// 将 pImageSurface 的内容传输到 上
SDL_BlitSurface(pImageSurface, NULL, pWindowSurface, NULL);
//SDL_BlitScaled(pImageSurface, NULL, pWindowSurface, NULL);
// 上屏操作,将 Surface 内容显示到屏幕上
SDL_UpdateWindowSurface(window);
}
SDL_FreeSurface(pImageSurface);
SDL_DestroyWindow(window);
return 0;
}
如果想要图片自适应窗口,请使用SDL_BlitScaled。
IMG_LoadTexture代码示例:
#include <iostream>
#include <SDL.h>
#include <SDL_image.h>
#undef main
int main()
{
SDL_Window *window = SDL_CreateWindow("demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Texture* texture = IMG_LoadTexture(renderer, "D:/2.png");
if (texture == NULL) {
SDL_Log("Failed to load image: %s", SDL_GetError());
return 1;
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
SDL_Delay(3000);
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
return 0;
}