首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

SDL 圖片載入與顯示實戰:BMP 載入、表面優化與 Blit 繪製

     編輯:關於C語言

SDL 圖片顯示三步驟

在 SDL 中顯示圖片需完成三個步驟:

  1. 載入圖片:建立影像表面
  2. Blit 位塊傳輸:將影像表面「貼」到顯示表面
  3. 螢幕刷新:呼叫 SDL_Flip 更新畫面

BMP 格式載入與表面優化

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

Blit 位塊傳輸與座標控制

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

安裝 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"
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved