Linux下的SDL圖片瀏覽
#include "SDL.h"//#include "SDL_ttf.h"#include "SDL_rotozoom.h"#include "SDL_image.h"#include "math.h"#include "string.h"#define MAX 16#define BMP_NAME "icon.bmp"#define ICON "sample.bmp"#define TITLE_NAME "TestSDL"#define ICON_NAME "My WinFrame"//表單最小化name//#define PNG_NAME "Bliss.png"//背景圖片#define TEXT "歡迎光臨"//文字設定#define TEXT_SIZE 50//設定字型大小#define WIDTH 640#define HEIGTH 480char *picture[] = { "1.jpg" , "2.jpg" , "3.jpg" , "4.jpg" , "5.jpg" , "6.jpg" , "7.jpg" , "8.jpg" , "9.jpg" , "10.jpg" , "11.jpg" , "12.jpg" , "13.png" , "14.jpg" , "15.jpg" , "16.jpg" };static SDL_Surface *screen = NULL;int Init()//初始化SDL{if((SDL_Init(SDL_INIT_VIDEO)&&IMG_Init(IMG_INIT_PNG)) == -1){fprintf(stderr,"SDL init error:%s",SDL_GetError());return -1;}return 0;}SDL_Surface *loadBMP(char *fileName)//載入bmp圖片{SDL_Surface *bmp;bmp = SDL_LoadBMP(fileName);if(bmp == NULL){fprintf(stderr,"Could not load %s: %s",fileName,SDL_GetError());exit(1);}return bmp;}void creatScreen(int width , int height , int bpp , Uint32 flags)//建立一個VideoMode{screen = SDL_SetVideoMode(width , height, bpp , flags);if(screen == NULL){fprintf(stderr,"Could not Creat a Screen!:%s",SDL_GetError());exit(1);}return ;}int Destory(SDL_Surface *file)//釋放空間{SDL_FreeSurface( file );return 0;}void show_Pic(SDL_Surface *bmp ,SDL_Rect *rect)//顯示bmp圖片{SDL_BlitSurface(bmp , NULL , screen , rect);SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );return ;}int getRightPic(int i){i++;if(i % 15 == 0){i = 0;}return i; }int getLeftPic(int i){i--;if(i < 0){i = 15;}return i; }void zoomBig(double *a){*a -= 0.25;if(*a <= 1.5){*a = 1.5;}}void zoomSmall(double *a){*a += 0.25;if(*a >= 5){*a = 5;}}void draw_button(char *str , int flag){if(strcmp(str , "left") == 0){boxColor(screen, 160, 420 , 200, 460, 0xf3f5ffff);if(flag == 1){hlineColor( screen, 160 , 200 ,460 , 0x000000ff);vlineColor( screen, 200 , 420 , 460 , 0x000000ff);}show_Pic( screen , &(screen->clip_rect) );}if(strcmp(str , "right") == 0){boxColor(screen, 438, 420 , 478, 460, 0xf3f5ffff);if(flag == 1){hlineColor( screen, 438 , 478 , 460, 0x000000ff);vlineColor( screen, 478 , 420 , 460 , 0x000000ff);}show_Pic( screen , &(screen->clip_rect) );}return ;}void button(char *str){SDL_Rect rect;int x,y;if(strcmp(str , "left") == 0){boxColor(screen, 160, 420 , 200, 460, 0xf3f5ffff);SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );}if(strcmp(str , "right") == 0){boxColor(screen, 438, 420 , 478, 460, 0xf3f5ffff);SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );}}int main(int argc,char **argv){const SDL_VideoInfo *info = NULL;int flag = 1;int i = 0;int width = WIDTH;int heigth = HEIGTH;int bpp = 0;double zoom_x,zoom_y;SDL_Surface *backpng = NULL;Init();creatScreen(width , heigth, bpp , SDL_SWSURFACE);info = SDL_GetVideoInfo();if(info == NULL){fprintf( stderr, "Video query failed: %s\n",SDL_GetError( ) );exit(1);}bpp = info->vfmt->BitsPerPixel ;//得到VideoMode的色度bppbackpng = IMG_Load(picture[i]);if(!backpng){fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());exit(1);}zoom_x = (double)((screen->w) / (double)(backpng->w));zoom_y = (double)((screen->h) / (double)(backpng->h));backpng = zoomSurface(backpng , zoom_x , zoom_y , 1);show_Pic(backpng ,&(screen->clip_rect));SDL_Rect fillRect;fillRect.x = 107;fillRect.y = 80;fillRect.w = 426;fillRect.h = 320;SDL_WM_SetCaption(TITLE_NAME, ICON_NAME);//設定視窗標題SDL_WM_SetIcon(loadBMP(ICON) , NULL);//設定表徵圖static double zoomXY = 1.5;SDL_Event event;while(flag){while(SDL_PollEvent(&event))//將事件加入事件隊列隊列{switch(event.type){case SDL_KEYDOWN:printf("Key Down......\n");if(event.key.keysym.sym == SDLK_ESCAPE){flag = 0;}if(event.key.keysym.sym == SDLK_SPACE){backpng = IMG_Load(picture[0]);if(!backpng){fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());exit(1);}zoom_x = (double)((screen->w) / (double)(backpng->w));zoom_y = (double)((screen->h) / (double)(backpng->h));backpng = zoomSurface(backpng , zoom_x , zoom_y , 1);show_Pic(backpng ,&(screen->clip_rect));Destory(backpng);backpng = NULL;}break;case SDL_KEYUP:/**keyborad test*/printf("Key up......\n");printf("key : %d\n" , event.key.keysym.sym );if(event.key.keysym.sym == 269){zoomSmall(&zoomXY);}if(event.key.keysym.sym == 270){zoomBig(&zoomXY);}break;case SDL_MOUSEMOTION:/**mouse motton test*/printf("mouse motton : x = %d , y = %d\n" ,event.button.x , event.button.y);break;case SDL_MOUSEBUTTONDOWN:draw_button("left" , 0) ;draw_button("right" , 0) ; if(((event.button.x >= 160) && (event.button.x <= 200 )) && ((event.button.y >= 420) && (event.button.y <= 460 ))){draw_button("left" , 1) ;i = getLeftPic(i);backpng = IMG_Load(picture[i]);if(!backpng){fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());exit(1);}zoom_x = (double)((screen->w) / (double)(backpng->w));zoom_y = (double)((screen->h) / (double)(backpng->h));backpng = zoomSurface(backpng , (zoom_x / zoomXY), (zoom_y / zoomXY) , 1);SDL_Rect rect;rect.x = (screen->w - backpng->w ) / 2;rect.y = (screen->h - backpng->h ) / 2;rect.w = backpng->w;rect.h = backpng->h;printf("%d , %d , %d , %d\n" , rect.x, rect.y, rect.w , rect.h );SDL_FillRect(screen ,&fillRect , 0xffffffff);SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );show_Pic(backpng , &rect);Destory(backpng);backpng = NULL;}if( (event.button.x >= 438 && event.button.x <= 478 ) && (event.button.y >= 420 && event.button.y <= 460 ) ){draw_button("right" , 1) ; i = getRightPic(i);backpng = IMG_Load(picture[i]);if(!backpng){fprintf(stderr,"Could not load %s: %s\n",picture[i],SDL_GetError());exit(1);}zoom_x = (double)((screen->w) / (double)(backpng->w));zoom_y = (double)((screen->h) / (double)(backpng->h));backpng = zoomSurface(backpng , (zoom_x / zoomXY), (zoom_y / zoomXY) , 1);SDL_Rect rect;rect.x = (screen->w - backpng->w ) / 2;rect.y = (screen->h - backpng->h ) / 2;rect.w = backpng->w;rect.h = backpng->h;printf("%d , %d , %d , %d\n" , rect.x, rect.y, rect.w , rect.h );SDL_FillRect(screen ,&fillRect , 0xffffffff);SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );show_Pic(backpng , &rect);Destory(backpng);backpng = NULL;}break;case SDL_MOUSEBUTTONUP:draw_button("left" , 0) ;draw_button("right" , 0) ;break;case SDL_QUIT:printf("quit\n");flag = 0;break;}}}Destory(backpng);Destory(screen);//TTF_Quit();SDL_Quit();return 0;}