SDL2學習(一): 顯示一張圖片


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。解壓后的目錄如下:
image.png

1.2 配置環境

使用VS新建一個C++控制台工程,並做如下配置:

  • 將解壓后的SDK庫拷貝到工程目錄下,然后配置VS工程;
  • "C/C++"-->"常規"-->"附加包目錄",填入SDL的相對include目錄;

image.png

  • "鏈接器"-->"常規"-->"附加庫目錄",填入SDL的相對lib目錄。

image.png

  • "C++"-->"代碼生成"-->"運行庫",選擇"多線程 DLL(/MD)"

image.png

  • "鏈接器"-->"系統"-->"子系統"更改為"窗口"

image.png

  • 最后,為了不每次都需要將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;
}

image.png
如果要顯示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);

總體流程:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM