?? bmp.c
字號:
/***********************************************************這個程序實現的功能是整個開發項目工程中的圖片瀏覽的機能部分,整個程序分為兩個線程,一個主線程負責聲明函數,創建子線程,并判斷全局變量,并作出相應的操作。子線程接收觸摸屏的信息并處理。*************************************************************/#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>
#include <fcntl.h>#include <unistd.h>#include "s3c2410_ts.h" #include <SDL/SDL.h>#include <avcodec.h>#include <avformat.h>#include <stdio.h>#include <pthread.h>#include <unistd.h>#define bmp_data_max 5//宏定義存儲最大圖片數量的值int STATE = 5;void *thread1(void *);int bmp_data =-1;//存儲圖片的路徑和名的數組的初始值/***********************************************************main()主線程負責創建子線程,并控制結束。并判斷全局變量,作出相應的操作。*************************************************************/int main(){ pthread_t t_a; pthread_create(&t_a,NULL,thread1,(void *)NULL); //創建進程t_a char *string[bmp_data_max];//定義存儲圖片的路徑和名的數組指針 SDL_Surface *screen =SDL_SetVideoMode (320, 240, 0, SDL_HWSURFACE);//screen的初始化,用于顯示圖片的基礎框架 /*子函數的聲明*/ void ShowBMP(char *file, SDL_Surface *screen,int x, int y); void mpeg_next(SDL_Surface *screen); void mpeg_back(SDL_Surface *screen); void mpeg_play(SDL_Surface *screen,char *string); void mpeg_stop(); void mpeg_close(); void mpeg_pause(); /*已經下載到開發板上的圖片的路徑和名*/ string[0]="/qinbo/moon.bmp"; string[1]="/qinbo/qiutian.bmp"; string[2]="/qinbo/ipod.bmp"; string[3]="/qinbo/xue.bmp"; string[4]="/qinbo/hua.bmp"; /*判斷全局變量,作出相應的操作。*/for(;;) { switch(STATE) { case 5 :{ ShowBMP("/qinbo/panasonic_pic.bmp", screen,0, 0);break;}//進入初始狀態,顯示初始圖片 case 1 :{mpeg_play(screen,string[bmp_data]);break;}//進入播放狀態 case 3 :{mpeg_stop();break;}//進入停止狀態 case 2 :{mpeg_pause();break;}//進入暫停狀態 case 4 : {mpeg_close();break;}//執行關閉 case 6 :{mpeg_next(screen);break;}//進入播放下一張狀態 case 7 : {mpeg_back(screen);break;}//進入播放上一張狀態 case 0 :{ ShowBMP(string[bmp_data], screen,0, 20);break;}//循環顯示當前圖片 default : STATE = 3;//進入停止狀態 } } exit(0); //退出結束線程 }/***********************************************************這個子線程實現的功能是接收觸摸屏的信息并處理,將處理得到的值賦值給全局變量*************************************************************/void *thread1(void *junk){ /*初始化觸摸屏*/ int fileno; int fangdou_flag =1; //定義防抖標志位,初始值賦1
TS_EVENT ev; //定義結構體,用于接收觸摸屏信息
memset(&ev, 0, sizeof(struct s3c2410_ts_event));
fileno = open("/dev/ts",O_RDONLY);//以只讀方式打開觸摸屏設備
if (fileno == -1) {
printf("open device error!\n");
return NULL;
}
//循環接收觸摸屏的信息 for(;;) {
if(read(fileno, &ev, sizeof(struct s3c2410_ts_event)))//讀取由觸摸屏驅動得到的坐標信息 { /*觸摸屏坐標的校正*/ double i_tmp=2.984,j_tmp=3.708; ev.x=(unsigned int)((986-ev.x)/i_tmp); ev.y=(unsigned int)((948-ev.y)/j_tmp); if ((ev.pressure)&&(fangdou_flag==1))//防抖判斷,保證在一次有效的點擊中只輸出一個信號 { printf("x= %d, y= %d, flag=0x%04x\n", ev.x, ev.y, ev.pressure); /*根據得到的坐標值判斷,對全局變量進行賦值*/ if ((ev.y>=220)&&(ev.y<=240)) { if ((ev.x>=143)&&(ev.x<=190))STATE=1;//播放 else if((ev.x>250)&&(ev.x<=275)) STATE = 2;//暫停 else if((ev.x>50)&&(ev.x<=75)) STATE = 3;//停止 else if((ev.x>200)&&(ev.x<=245)) STATE = 6;//下一張 else if((ev.x>90)&&(ev.x<=130)) STATE = 7;//上一張 } else if((ev.y>=0)&&(ev.y<=20)) { if ((ev.x>=285)&&(ev.x<=320))STATE=4;//退出 }fangdou_flag = 0;//防抖標志位置0 } if(ev.pressure == 0)//判斷是否結束一次點擊 fangdou_flag = 1;//如果結束一次點擊了,那么防抖標志位置1,重新可以接收下一次點擊 } } close(fileno);//關閉設備文件
return 0;//返回}/***********************************************************這個子函數實現的功能是圖片瀏覽的主要機能部分,用于播放一張圖片。*************************************************************/void ShowBMP(char *file, SDL_Surface *screen,int x, int y) { if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) //初始化SDL { fprintf(stderr, "無法初始化SDL: %s\n", SDL_GetError());//初始化失敗 exit(1); } //SDL_Surface *screen; //screen=SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE); if ( screen==NULL ) { //screen用于顯示圖片的基礎外框 fprintf(stderr, "無法設置640x480的視頻模式:%s\n", SDL_GetError());//無法設置640x480的視頻模式,只能播放小于320*240的圖片 exit(1); } SDL_Surface *image; SDL_Rect dest; /* 將BMP文件加載到一個surface*/ image = SDL_LoadBMP(file); if ( image == NULL ) { fprintf(stderr, "無法加載 %s: %s\n", file, SDL_GetError());//加載失敗 return; } /* 初始化界面的長,寬,起始繪圖點的坐標值, */ dest.x = x; dest.y = y; dest.w = image->w; dest.h = image->h; /*按照設定值顯示圖片*/ SDL_BlitSurface(image, NULL, screen, &dest); SDL_UpdateRects(screen, 1, &dest); SDL_FreeSurface(image);//釋放image atexit(SDL_Quit);//退出}/***********************************************************這個子函數實現的功能是播放下一張圖片。*************************************************************/void mpeg_next(SDL_Surface *screen){ if(bmp_data==(bmp_data_max-1))//判斷是否為最后一張圖片 bmp_data=0;//如果是,再重新置零,從頭顯示 else {bmp_data++;}//否則,指向下一張圖片 STATE=0;// }/***********************************************************這個子函數實現的功能是播放上一張圖片。*************************************************************/void mpeg_back(SDL_Surface *screen){ if((bmp_data==0)||(bmp_data==-1)) bmp_data=bmp_data_max-1; else {bmp_data--;} STATE=0;//循環顯示當前圖片,等待下一次點擊 }/***********************************************************這個子函數實現的功能是:以幻燈片的方式每隔1秒,播放一張圖片。*************************************************************/void mpeg_play(SDL_Surface *screen,char *string){ if (bmp_data==bmp_data_max-1)//判斷是否為最后一張圖片 {bmp_data=0;//如果是,再重新置零,從頭顯示 } else bmp_data++;//否則,指向下一張圖片 ShowBMP(string, screen,0,20);//調用顯示圖片的子函數 SDL_Delay(1000);//延遲1秒}/***********************************************************這個子函數實現的功能是:停止當前播放,回到主界面控制狀態*************************************************************/void mpeg_stop(){ STATE = 5;//進入初始狀態,顯示初始圖片 bmp_data = -1;//將存儲圖片數組初始化}/***********************************************************這個子函數實現的功能是:停止當前播放,退出圖片瀏覽的程序*************************************************************/void mpeg_close(){ exit(0);}/***********************************************************這個子函數實現的功能是:進入暫停狀態*************************************************************/void mpeg_pause(){ //空循環}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -