本文优化上文所给出的显示bmp图片的程序,并且通过添加新的库文件,使得SDL支持更多的图片格式。
(1) 添加SDL_image库
下载地址:http://www.libsdl.org/projects/SDL_image/
添加方法与SDL学习(一)中介绍的相同,这里不再重复。
(2) 测试
测试代码如下所示:
#include "SDL.h"
#include "SDL_image.h"
#include <string>
// The attributes of the screen
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
// The surfaces that will be used
SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;
SDL_Surface *load_image(std::string filename) // 加载图片函数
{
// Temporary storage for the image that's loaded
SDL_Surface *loadedImage = NULL;
// The optimized image that will be used
SDL_Surface *optimizedImage = NULL;
// Load the image
//loadedImage = SDL_LoadBMP(filename.c_str()); // 该函数只支持bmp图片格式
loadedImage = IMG_Load(filename.c_str()); // 该函数支持BMP, PNM, XPM, LBM, PCX, GIF, JPEG, TGA, PNG格式的图片
if (loadedImage != NULL)
{
// Create an optimized image
optimizedImage = SDL_DisplayFormat(loadedImage); // 该函数将图片格式转换为与screen相同的格式
// Free the old image
SDL_FreeSurface(loadedImage);
}
// Return the optimized image
return optimizedImage;
}
void apply_surface(int x, int y, SDL_Surface *source, SDL_Surface *destination)
{
// Make a temporary rectangle to hold the offsets
SDL_Rect offset;
// Give the offsets to the rectangle, 这个偏移是以左上角为原点的偏移量
offset.x = x;
offset.y = y;
// Blit the surface
SDL_BlitSurface(source, NULL, destination, &offset);
}
int main(int argc, char *argv[])
{
// Initialize all SDL subsystems
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return 1;
}
// Set up the screen
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
// If there was an error in setting up the screen
if (screen == NULL)
{
return 1;
}
// Set the window caption
SDL_WM_SetCaption("Hello World", NULL);
// Load images
message = load_image("F:/program/SDL/examples/Init/Debug/lyf.jpg");
background = load_image("F:/program/SDL/examples/Init/Debug/background.bmp");
// Apply the background to the screen
apply_surface(0, 0, background, screen);
//apply_surface(320, 0, background, screen);
//apply_surface(0, 240, background, screen);
//apply_surface(320, 240, background, screen);
// Apply the message to the screen
apply_surface(180, 140, message, screen);
// Update the screen
if (SDL_Flip(screen) == -1)
{
return 1;
}
// Wait 2 seconds
SDL_Delay(2000);
// Free the surfaces
SDL_FreeSurface(message);
SDL_FreeSurface(background);
// Quit SDL
SDL_Quit();
// Return
return 0;
}