⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmp.c

📁 fs2410下借用SDL.FFMPEG库实现一个触摸屏的播放器程序。请参照源码在相应目录下自己放置一个要播放的MPG文件。
💻 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 + -