📄 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 + -