SDL_image库的使用
SDL默认只支持bmp格式的图片显示,而大多数情况下,我们需要显示jpeg,png格式图片,这时候我们需要使用SDL扩展库。在开发前应先确认SDL_image库是否已编译安装成功。
首先需要先下载SDL_image,可以从SDL的官网获取最新版本。你也可以从其中的“Libraries”章节下载这个库,就在SDL的主页上。如果你不想为此麻烦,在本文件夹内已有SDL_image-1.2.10.tar.tar,只需按照《SDL编译移植文档》安装即可。
在程序中使用SDL_ttf库,必须使用如下头文件,注意SDL是大写
#include
Linux应用程序链接时要也要链接这个库的-lSDL_image。
SDL_image编程
BMP格式的图片为例:
初始化
先对屏幕进行初始化,使用函数SDL_SetVideoMode(w,h, desired_bpp, video_flags)来完成,设定屏幕参数。
下载图片到内存
设置好后,导入位图,将其下载于内存中,bmpfile为选定的图片名:
img = SDL_LoadBMP(filename); 图象如果导入正确,就将保存在 img 参数中。有时候我们需要显示一张图片的一部分,只需对上面的参数SDL_Rect*clip进行定义就可实现。
释放内存
使用SDL_FreeSurface(newimg);
Jpeg、png图片显示
与bmp格式图片显示有两点不同:
首先是把SDL_LoadBMP改成IMG_Load。
其次,把SDL_DisplayFormat改成SDL_DisplayFormatAlpha。BMP文件不支持alpha通道的吧,但PNG却支持。如果想留住alpha通道,那就需要用SDL_DisplayFormatAlpha来代替SDL_DisplayFormat。
例程如下(编译时注意链接-lSDL_image):
#include
SDL_Surface*screen,*map;
staticvoid quit(int rc)
{
SDL_Quit();
exit(rc);
}
voidShowMap(char *filename,int x,int y)
{
SDL_Rectoffset;
map= IMG_Load(filename);
if(map== NULL){
fprintf(stderr,"Couldn'tload %s:%s\n",filename,SDL_GetError());
quit(1);
}
offset.x= x;
offset.y= y;
SDL_BlitSurface(map,NULL,screen,&offset);
SDL_UpdateRects(screen,1,&offset);
SDL_FreeSurface(map);
}
intmain(int argc,char *argv[])
{
char*file;
intw,h;
Uint8bpp;
Uint32flags;
w= 320;
h= 240;
bpp= 0;
flags= SDL_SWSURFACE;
if(SDL_Init(SDL_INIT_VIDEO)< 0){
fprintf(stderr,"Couldn'tinitialize SDL:%s\n",SDL_GetError());
return(1);
}
if((screen=SDL_SetVideoMode(w,h,bpp,flags))== NULL){
fprintf(stderr,"Couldn'tset %dx%dx%d video mode: %s\n",w,h,bpp,SDL_GetError());
quit(1);
}
SDL_WM_SetCaption("SDLjice","jicetest");
ShowMap("maps/Pepe.jpg",0,0);
ShowMap("maps/100.bmp",100,50);
SDL_Delay(1000);
SDL_Quit();
return0;
}
Agar压缩或放大图片
在许多应用中,我们需要将图片完整的显示在屏幕中,或者根据需要大小来指定显示图片的大小。而图片的尺寸经常与我们所需要的尺寸不一致,即使将图片在规定的尺寸内显示出来,也会因为图片太大而显示速度很慢,或者因为图片太小而严重失真。因此,我们需要将大图片压缩至指定大小,将小图片放大至指定大小。
使用函数}