在 SDL 中顯示圖片需完成三個步驟:
SDL_Flip 更新畫面SDL 核心僅支援 BMP 格式,使用 SDL_LoadBMP 載入。但載入後的表面格式可能與顯示表面不同,每次繪製都需格式轉換,影響效能。解決方案是使用 SDL_DisplayFormat 依顯示表面格式建立優化副本:
SDL_Surface *loadImage(char *filename) {
SDL_Surface *loaded = SDL_LoadBMP(filename);
if (!loaded) return NULL;
SDL_Surface *optimized = SDL_DisplayFormat(loaded);
SDL_FreeSurface(loaded); // 釋放原始表面
return optimized;
}
#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"
#define WIDTH 800
#define HEIGHT 600
#define BPP 32
SDL_Surface *gpScreen = NULL;
SDL_Surface *gpClock = NULL;
SDL_Surface *loadImage(char *filename);
int main(int argc, char *argv[]) {
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
printf("SDL 初始化失敗: %s\n", SDL_GetError());
exit(-1);
}
atexit(SDL_Quit);
gpScreen = SDL_SetVideoMode(WIDTH, HEIGHT, BPP,
SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF);
if (!gpScreen) {
printf("視窗建立失敗: %s\n", SDL_GetError());
exit(1);
}
gpClock = loadImage("clock.bmp");
if (!gpClock) {
printf("圖片載入失敗\n");
exit(1);
}
// 將時鐘圖片貼到顯示表面左上角
SDL_BlitSurface(gpClock, NULL, gpScreen, NULL);
SDL_Flip(gpScreen); // 刷新螢幕
SDL_Delay(30000); // 顯示 30 秒
SDL_FreeSurface(gpScreen);
SDL_FreeSurface(gpClock);
return 0;
}
SDL_BlitSurface(src, srcrect, dst, dstrect) 參數說明:
src:來源表面srcrect:來源矩形區域(NULL 表整張圖)dst:目標表面(通常是顯示表面)dstrect:目標位置矩形(NULL 表左上角)SDL_Rect dstRect; dstRect.x = (WIDTH - gpClock->w) / 2; dstRect.y = (HEIGHT - gpClock->h) / 2; dstRect.w = gpClock->w; dstRect.h = gpClock->h; SDL_BlitSurface(gpClock, NULL, gpScreen, &dstRect);
安裝 SDL_image 擴充庫可支援 PNG、JPG、GIF 等格式。只需將載入函數改為 IMG_Load:
#include "SDL_image.h"
// 專案需連結 SDL_image.lib
SDL_Surface *loadImage(char *filename) {
SDL_Surface *loaded = IMG_Load(filename); // 支援多種格式
if (!loaded) return NULL;
SDL_Surface *optimized = SDL_DisplayFormat(loaded);
SDL_FreeSurface(loaded);
return optimized;
}
"clock.bmp"(同目錄)、"image\\clock.bmp"(子目錄,雙反斜線)"d:\\bmp\\clock.bmp"