SDL圖片的縮放和旋轉


#include <SDL.h>

#include "SDL_rotozoom.h"

#include "SDL_p_w_picpath.h"

#include "math.h"

#include "string.h"

#include "SDL_gfxPrimitives.h"



/*


初始化SDL 函數庫

SDL——INITEVERTHING 代表所有的 視頻音頻 圖片 ...


*/


SDL_Surface * screen = NULL;

void Init()

{


   if(SDL_Init(SDL_INIT_EVERYTHING)==-1)

   {

       printf("SDL_INITfault !\n");

       exit(0);

   }


}

// 創建屏幕 640*480 0  SDL_SWSURFACE

void Create_Screen(int width , int height , int bpp ,Uint32 flags)

{



   //SDL_Surface*screen = NULL;

   screen =SDL_SetVideoMode(width , height,  bpp ,flags);

   if(screen ==NULL)

   {

       printf("SDL_SetVideoModedefault !\n");

       exit(1);

   }


}

// 加載圖片 傳遞文件的 絕對路徑

SDL_Surface * Image_Load(char *filename)

{

   SDL_Surface*p_w_picpath = NULL;

   p_w_picpath =IMG_Load(filename);

   if(p_w_picpath ==NULL)

   {

       printf("Thep_w_picpath load default, maybe can't find %s !!!\n",filename);

       exit(0);


   }

   return p_w_picpath;

}

void Free_Image(SDL_Surface * p_w_picpath)

{

   SDL_FreeSurface(p_w_picpath);


}


//用來顯示 p_w_picpath 圖片,rect 可以調節位置

int Show_Image(SDL_Surface * p_w_picpath,SDL_Rect *rect)

{


   SDL_BlitSurface(p_w_picpath, NULL , screen , rect);

   SDL_UpdateRect(screen, 0 , 0 , 0 , 0 );

   return 0;

}


SDL_Rect Set_Image(SDL_Surface *p_w_picpath ,double zoom)

{

   //double x,y;

   SDL_Rectrect;


   rect.x =  (screen->w - p_w_picpath->w ) / 2;

   rect.y =  (screen->h - p_w_picpath->h ) / 2;


   return rect;


}


void Zoom_Small(double* x,SDL_Surface *p_w_picpath)

{

   SDL_Rect rect;

   if(*x <=0)

   return ;

   *x = *x-0.05;

   SDL_Surface*p_w_picpath_1;

   p_w_picpath_1 =zoomSurface(p_w_picpath , *x , *x, 1);

   boxColor(screen,0, 0, screen->w, screen->h, 0x000000ff);

   rect =Set_Image(p_w_picpath_1 , *x);

   Show_Image(p_w_picpath_1,&rect);

   Free_Image(p_w_picpath_1);



}


void Zoom_Big(double* x,SDL_Surface *p_w_picpath)

{

   *x =  *x + 0.05;

   SDL_Rectrect;  

   SDL_Surface*p_w_picpath_1;

   p_w_picpath_1 =zoomSurface(p_w_picpath , *x , *x, 1);

   boxColor(screen,0, 0, screen->w, screen->h, 0x000000ff);

   rect =Set_Image(p_w_picpath_1 , *x);

   Show_Image(p_w_picpath_1,&rect);


   Free_Image(p_w_picpath_1);

}

SDL_Surface *Change_Angle(SDL_Surface *p_w_picpath ,double*angle,double * x)

{

   SDL_Surface*change = NULL;

   SDL_Rectrect;


   *angle =*angle -10.0;



   boxColor(screen,0, 0, screen->w, screen->h, 0x000000ff);

   change =rotozoomSurfaceXY(p_w_picpath, *angle, *x, *x, 1);


   rect =Set_Image(change , *x);

   Show_Image(change,&rect);


   returnchange;


}

void Drav_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_Image(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_Image(screen , &(screen->clip_rect) );    

   }

   return ;

}



int main()

{

   SDL_Surface *p_w_picpath = NULL;

   SDL_Surface *change = NULL;

   int flag = 1;

   doublezoom_xy = 1,angle = 0;

   Init();

   Create_Screen(640,480,0,SDL_SWSURFACE);

   p_w_picpath =Image_Load("sheep4.jpg");

   Show_Image(p_w_picpath,NULL);

   printf("helloworld \n");


   SDL_Eventevent;

   while(flag)

   {

       while(SDL_PollEvent(&event))            //將事件加入事件隊列隊列

       {  

           switch(event.type)

           {

               caseSDL_KEYDOWN:

                   printf("Thekey is %d\n",event.key.keysym.sym);


                   if(event.key.keysym.sym== SDLK_ESCAPE)

                   {

                       flag= 0;

                   }

                   if(event.key.keysym.sym== SDLK_SPACE)

                   {

                       printf("Thespace is down ... \n");

                   }

/* 事件中按 s 圖片縮小 按b 放大 ,點擊鼠標開始旋轉

                   if(event.key.keysym.sym== 115)

                   {

                       printf("Thep_w_picpath is become smaller !\n");

                       Zoom_Small(&zoom_xy,p_w_picpath);

                       printf("%lf\n",zoom_xy);

                   }

                   if(event.key.keysym.sym== 98)

                   {

                       printf("Thep_w_picpath is become smaller !\n");

                       Zoom_Big(&zoom_xy,p_w_picpath);

                       printf("%lf\n",zoom_xy);

                   }

               caseSDL_KEYUP:

                   {



                   }break;

               caseSDL_MOUSEBUTTONDOWN:

                       Drav_Button("left", 0);

                       //circleColor(screen,320, 240, 240, 0x000000ff);

                       //change= rotozoomSurfaceXY(p_w_picpath, 90.0, 1, 1, 1);

                       //change= shrinkSurface(p_w_picpath,320,240);

                       //Show_Image(change,0);

                       Change_Angle(p_w_picpath,&angle,&zoom_xy);

                       //Drav_Button("right",0 );

                       break;  

               caseSDL_MOUSEBUTTONUP:    

                      // Drav_Button("left" , 1);

                       //Drav_Button("right",1 );

                       break;

               caseSDL_QUIT:

                   {

                       flag= 0;

                   }break;


           }

       }


   }

   Free_Image(p_w_picpath);

   return 0;

}



Write by douyuan888 2012/12/30


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章