SDL2 加载图片

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代码示例:

cpp 复制代码
#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代码示例:

cpp 复制代码
#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;
}
相关推荐
布丁小站9 天前
SDL录制音频并播放
音视频·sdl
程序员黄老师20 天前
Windows下SDL2创建最简单的一个窗口
c++·windows·sdl·sdl2
程序员黄老师20 天前
Windows与Linux下 SDL2的第一个窗口程序
c++·windows·ffmpeg·sdl
烈日下的奔跑1 个月前
SDL直接渲染yuv视频帧数据
ffmpeg·音视频·sdl
melonbo2 个月前
SDL 与 OpenGL 的关系
opengl·sdl
烈日下的奔跑2 个月前
SDL库自适应窗口大小及遇到的坑
ffmpeg·sdl
melonbo2 个月前
qt工程中调用sdl的流程
qt·sdl
dvlinker2 个月前
基于开源FFmpeg和SDL2.0的音视频解码播放和存储系统的实现
ffmpeg·开源·ffplay·sdl·存储系统·音视频解码播放
程序员正茂3 个月前
在VS2017下FFmpeg+SDL编写最简单的视频播放器
c++·ffmpeg·sdl·vs2017
十年编程老舅4 个月前
音视频开发_SDL多线程
音视频·音视频开发·sdl·c++音视频·c++多线程