Linux下的SDL圖片瀏覽

來源:互聯網
上載者:User

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;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.