maintask.c
上传用户:kaigelee
上传日期:2022-07-13
资源大小:6432k
文件大小:13k
源码类别:

图片显示

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <direct.h>
  3. #include <stdio.h>
  4. #include <io.h>
  5. #include "pub/osg.h"
  6. #include "pub/system_drv.h"
  7. enum
  8. {
  9. MSG_PGDOWN,
  10. MSG_PGUP,
  11. MSG_KeyUP,
  12. MSG_KeyDOWN,
  13. MSG_KeyLEFT,
  14. MSG_KeyRIGHT,
  15. MSG_KeySELECT
  16. };
  17. typedef struct _T_Message
  18. {
  19. INT32U param0;
  20. INT32U param1;
  21. INT32U param2;
  22. INT32U param3;
  23. }T_Message;
  24. UINT32 Test_queueID;
  25. /*位图文件头*/
  26.     typedef struct BmpFileHeader
  27.    {
  28.     INT16U fileId;                //文件标识
  29. INT32U fileSize;              //文件大小
  30. INT32U fileRe;                // 保留
  31. INT32U dataEx;             //位图数据偏
  32. INT32U informationHeadSize;   //信息头长度
  33. INT32U width;                  //宽
  34.     INT32U height;                //高
  35. INT16U page;                  //面数
  36. INT16U pel_bit;               //每个象素的位数 
  37.     INT32U rel;                  //压缩信息
  38. INT32U bmpSize;              //位图数据大小
  39. INT32U HDdefination;         //水平分辨率
  40.     INT32U UPdefination;        //垂直分辨率
  41.     INT32U colornum;            //位图使用的颜色数
  42.     INT32U importantclor;      //重要的颜色数
  43.    }BmpFileHeader;
  44. /*文件头的读取*/
  45.    void ReadBmpFileHeader(char *direction,BmpFileHeader *bmpfileheader)
  46.    {
  47.         FILE *fp;
  48.  INT16U tmp1[3];
  49.  INT32U tmp2[12];
  50.  fp=fopen(direction,"rb");
  51.  if(fp==NULL)
  52.  {
  53.    printf("error on open");
  54.    exit(1);
  55.   }
  56.   fread(&tmp1[0],2,1,fp);
  57.   bmpfileheader->fileId= tmp1[0];
  58.           fread(&tmp2[0],4,1,fp);
  59.   bmpfileheader->fileSize=tmp2[0];
  60.   fread(&tmp2[1],4,1,fp);
  61.   bmpfileheader->fileRe=tmp2[1];
  62.   fread(&tmp2[2],4,1,fp);
  63.   bmpfileheader->dataEx=tmp2[2];
  64.   fread(&tmp2[3],4,1,fp);
  65.   bmpfileheader->informationHeadSize=tmp2[3];
  66.   fread(&tmp2[4],4,1,fp);
  67.   bmpfileheader->width=tmp2[4];
  68.   fread(&tmp2[5],4,1,fp);
  69.   bmpfileheader->height=tmp2[5];
  70.   fread(&tmp1[1],2,1,fp);
  71.   bmpfileheader->page=tmp1[1];
  72.   fread(&tmp1[2],2,1,fp);
  73.   bmpfileheader->pel_bit=tmp1[2];
  74.   fread(&tmp2[6],4,1,fp);
  75.   bmpfileheader->rel=tmp2[6];
  76.   fread(&tmp2[7],4,1,fp);
  77.   bmpfileheader->bmpSize=tmp2[7];
  78.   fread(&tmp2[8],4,1,fp);
  79.   bmpfileheader->HDdefination=tmp2[8];
  80.   fread(&tmp2[9],4,1,fp);
  81.   bmpfileheader->UPdefination=tmp2[9];
  82.   fread(&tmp2[10],4,1,fp);
  83.   bmpfileheader->colornum=tmp2[10];
  84.   fread(&tmp2[11],4,1,fp);
  85.   bmpfileheader->importantclor=tmp2[11];
  86.   fclose(fp);
  87. }
  88.     /*一个延时函数用来进行特效处理*/
  89. void delay(int a,int b)
  90. {  int i,j;
  91. for(i=0;i<a;i++)
  92. {
  93.            for(j=0;j<b;j++);
  94. }
  95. }
  96.      void show_picture(char *filename)
  97.  {   
  98.  int m,n;
  99.          int i,j,padding,k,a,x,b;
  100.      INT32U data,red,green,blue;     //用于存储24位色的数据
  101.  INT32U  *pdata;
  102.  INT32U  *pdata1;
  103.  INT32U pal;
  104.  INT32U pal1[2];  //存储1位色的调色板
  105.  INT8U  data1;    //存储1位色的索引值
  106.  INT32U pal4[16];  //存储4位色的调色板
  107.  INT8U  data4;    //存储4位色的索引值
  108.  INT32U pal8[256];  //存储8位色的调色板
  109.  INT8U  data8;    //存储8位色的索引值
  110.  INT16U data16;   //16位色数据
  111.          
  112.  BmpFileHeader bmpfileheader;
  113.  FILE *fp;
  114.  fp=fopen(filename,"rb");//打开文件
  115.  if(fp==NULL)
  116.  {
  117.    printf("error on open");
  118.    exit(1);
  119.   }
  120.         
  121. ReadBmpFileHeader(filename,&bmpfileheader);//读取文件头信息
  122. m=bmpfileheader.width;
  123.     n=bmpfileheader.height;
  124.         pdata=(INT32U*)malloc(4*m*n);
  125. pdata1=pdata;
  126.         
  127. switch(bmpfileheader.pel_bit)
  128. {  
  129. /*显示一位数据*/
  130.     case 1:
  131. GFMDrawRectangle(0,0,726,576, 0xff000000, 1);
  132. fseek(fp,54,0);
  133. fread(&pal1[0],4,1,fp);//读调色板数据
  134. fread(&pal1[1],4,1,fp);
  135.                 rewind(fp);
  136. fseek(fp,bmpfileheader.dataEx,0);
  137.     padding=(8*(bmpfileheader.bmpSize/bmpfileheader.height)-bmpfileheader.width)/8;//一行中没用的字节数
  138. for(i=0;i<n;i++)
  139. {  
  140.                
  141.    for(j=0;j<m/8;j++)//每8个像素进行读取
  142.    {
  143.                   fread(&data1,1,1,fp);
  144.       for(k=0;k<8;k++)//每一个字节进行读取
  145.   {
  146.   a=(data1&0x80)==0x80? 1:0 ;//读取位图数据,每一位代表一个颜色索引值
  147.   data1<<=1;
  148.   *(pdata+k+8*j+(n-1-i)*m)=pal1[a];
  149.                      //GFMSetPixels(pal1[a],k+j*8,n-i,1);//逐点显示
  150.   }
  151.    }
  152.   
  153.    fread(&data1,1,1,fp);//当宽度不为8的整数倍时,剩余的像素的读取
  154.    /*for(x=0;x<m-8*j;x++)
  155.    {
  156.     a=(data1&0x80)==0x80? 1:0 ;
  157. data1<<=1;
  158.                 GFMSetPixels(pal1[a],x+8*j,n-i,1);
  159. }*/
  160.                
  161.    fread(&data1,padding,1,fp);
  162.  }  
  163. GFMWriteRectangle(0,0,m,n,pdata1);
  164.          rewind(fp);
  165.  break;
  166.  /*显示4位数据*/
  167. case 4:
  168. GFMDrawRectangle(0,0,726,576, 0xff000000, 1);
  169. fseek(fp,54,0);
  170. fread(pal4,4,16,fp);//读调色板数据
  171. rewind(fp);
  172. fseek(fp,bmpfileheader.dataEx,0);
  173. if(bmpfileheader.rel==0)
  174. {
  175. padding=(2*(bmpfileheader.bmpSize/bmpfileheader.height)-bmpfileheader.width)/2;//一行中没用的字节数
  176. for(i=0;i<n;i++)
  177. {   
  178. for(j=0;j<m/2;j++)//每两个像素进行读取
  179. {
  180. fread(&data4,1,1,fp);
  181. a=data4>>4;  //先读前面4位
  182. b=data4&(0x0f);//读后面4位
  183.                         *(pdata+2*j+(n-1-i)*m)=pal4[a];
  184.                         *(pdata+1+2*j+(n-1-i)*m)=pal4[a];
  185. // GFMSetPixels(pal4[a],0+j*2,n-i,1);
  186. // GFMSetPixels(pal4[b],1+j*2,n-i,1);
  187. }
  188. fread(&data4,1,1,fp);
  189.  /* if(m%2==1)  //还剩一个像素时,将这个像素显示
  190.   {
  191.    data4=data4&0xf0;
  192.    data4>>=4;
  193.                    GFMSetPixels(pal4[data4],2+2*j,n-i,1);
  194.   } */
  195.  fread(&data4,padding,1,fp);
  196. }
  197. GFMWriteRectangle(0,0,m,n,pdata1);
  198. }
  199.                rewind(fp);
  200.    break;
  201.     
  202.  /*显示8位数据*/
  203. case 8:
  204. GFMDrawRectangle(0,0,726,576, 0xff000000, 1);
  205.                 fseek(fp,54,0);
  206. fread(pal8,4,256,fp);//读调色板数据
  207.                 rewind(fp);
  208. fseek(fp,bmpfileheader.dataEx,0);
  209. if(bmpfileheader.rel==0)
  210. {
  211. padding = (4-(m)%4)%4;//一行中没用的字节数
  212. for(i=0;i<n;i++)
  213. {
  214. for(j=0;j<m;j++)
  215. {
  216. fread(&data8,1,1,fp);//读取一个字节
  217. *(pdata+j+(n-1-i)*m)=pal8[data8];
  218.        
  219. }
  220. fread(&data8,padding,1,fp);
  221. }
  222. for(i=0;i<10;i++)
  223. {
  224. for(j=0;j<10;j++)
  225. GFMDrawRectangle(0,0,726,576, 0xff000000, 1);
  226.         GFMWriteRectangle(i*10,j*10,m,n,pdata1);
  227.  
  228. }
  229.        delay(3333,33333);
  230. }
  231. }
  232. rewind(fp);
  233. break;
  234. case 16:
  235. GFMDrawRectangle(0,0,726,576, 0xff000000, 1);
  236. if(bmpfileheader.rel==0)//显示16位色1555模式
  237. {
  238. fseek(fp,bmpfileheader.dataEx,0);
  239. padding=((bmpfileheader.bmpSize/bmpfileheader.height)/2-bmpfileheader.width)*2;
  240. for(i=0;i<n;i++)
  241. {
  242. for(j=0;j<m;j++)
  243. {
  244. fread(&data16,2,1,fp);
  245. red=data16&0x7c00;//依次读取五位数据
  246. red<<=9;
  247. green=data16&0x03e0;
  248. green<<=6;
  249. blue=data16&0x001f;
  250. blue<<=3;
  251. data=red+green+blue;//将RGB值相加
  252. *(pdata+j+(n-1-i)*m)=data;
  253. // GFMSetPixels(data,j,n-1-i,1);
  254. }
  255. fread(&data,padding,1,fp);
  256. }
  257. GFMWriteRectangle(0,0,m,n,pdata1);
  258. rewind(fp);
  259. }
  260. else if(bmpfileheader.rel==3)
  261. {   
  262.                     fseek(fp,54,0);
  263.     fread(&pal,4,1,fp);//读文件头与位图数据之间4个字节的数据
  264. rewind(fp);
  265. if(pal==0xf800)//565模式
  266. {
  267. fseek(fp,bmpfileheader.dataEx,0);
  268. padding=((bmpfileheader.bmpSize/bmpfileheader.height)/2-bmpfileheader.width)*2;
  269. for(i=0;i<n;i++)
  270. {
  271. for(j=0;j<m;j++)
  272. {
  273. fread(&data16,2,1,fp);
  274. red=data16&0xf800;
  275. red<<=8;//读前五位数据
  276. green=data16&0x07e0;
  277. green<<=5;//读前六位数据
  278. blue=data16&0x001f;
  279. blue<<=3;//读后五位数据
  280. data=red+green+blue;//将RGB值相加
  281. *(pdata+j+(n-1-i)*m)=data;
  282. // GFMSetPixels(data,j,n-1-i,1);
  283. }
  284. fread(&data,padding,1,fp);
  285. }
  286. GFMWriteRectangle(0,0,m,n,pdata1);
  287. rewind(fp);
  288. }
  289. else if(pal==0x0f00)//4444模式
  290. {
  291. fseek(fp,bmpfileheader.dataEx,0);
  292. padding=((bmpfileheader.bmpSize/bmpfileheader.height)/2-bmpfileheader.width)*2;
  293. for(i=0;i<n;i++)
  294. {
  295. for(j=0;j<m;j++)
  296. {
  297. fread(&data16,2,1,fp);
  298. red=data16&0x0f00;
  299. red<<=12;//读前4位数据
  300. green=data16&0x00f0;
  301. green<<=8;//读前4位数据
  302. blue=data16&0x000f;
  303. blue<<=4;//读前4位数据
  304. data=red+green+blue;//将RGB值相加
  305. *(pdata+j+(n-1-i)*m)=data;
  306. // GFMSetPixels(data,j,n-1-i,1);
  307. }
  308. fread(&data,padding,1,fp);
  309. }
  310. GFMWriteRectangle(0,0,m,n,pdata1);
  311. rewind(fp);
  312. }
  313. }
  314.       break;
  315.             /*显示24位色*/
  316.     case 24:
  317. GFMDrawRectangle(0,0,726,576, 0xff000000, 1);
  318. fseek(fp,bmpfileheader.dataEx,0);
  319. padding = (4-(m*3)%4)%4;
  320.     for(i=0;i<n;i++)
  321. {
  322.    for(j=0;j<m;j++)
  323.    {
  324.                 fread(&data,3,1,fp);
  325.                 *(pdata+j+(n-1-i)*m)=data;
  326.    }
  327.               fread(&data,padding,1,fp);
  328. }
  329.    GFMWriteRectangle(0,0,m,n,pdata1);
  330. rewind(fp);
  331. break;
  332. }
  333.  }
  334. /*************************************************************************/
  335. /*                    在MainTask_Init中创建的任务                        */
  336. /*                    这个任务在接收队列的消息,而消息是从               */
  337. /*                    MainmenuKeyProcess 中发送出来的                    */
  338. /*        这个demo中是捕获右键,并循环显示“图片”目录下的文件名         */
  339. /*************************************************************************/
  340. void demoTask(void)
  341. {
  342. T_Message RecvMsg;
  343. INT8U acPath[200],acMask[200],filename[200];
  344. long done;
  345. struct _finddata_t   fileinfo;   
  346. getcwd(acPath, sizeof(acPath));
  347. sprintf(acPath, "%s\图片",acPath);
  348. sprintf(acMask, "%s\*.BMP",acPath);
  349. done = _findfirst(acMask, &fileinfo);
  350. if(done != -1)
  351. {
  352. FNTDrawText(0xff00ff00,24,50, 300, fileinfo.name );
  353. /*取到了文件名,和acpath一起组成完整的路径,用fopen打开进行分析和显示*/
  354. sprintf(filename,"%s\%s",acPath,fileinfo.name);
  355. show_picture(filename);
  356. }
  357. while(1)
  358. {
  359. DTOS_DRV_ReceiveMessage( Test_queueID, &RecvMsg);
  360. switch(RecvMsg.param0)
  361. {
  362. case MSG_PGDOWN:
  363. break;
  364. case MSG_PGUP:
  365. break;
  366. case MSG_KeyUP:
  367. break;
  368. case MSG_KeyDOWN:
  369. break;
  370. case MSG_KeyLEFT:
  371. break;
  372. case MSG_KeyRIGHT:
  373. if(done != -1)
  374. {
  375. if(_findnext(done, &fileinfo) == 0)
  376. {
  377. GFMDrawRectangle(50,300,669,24, 0xff000000, 1);
  378. FNTDrawText(0xff00ff00,24,50, 300, fileinfo.name );
  379.                        /*取到了文件名,和acpath一起组成完整的路径,用fopen打开进行分析和显示*/
  380. sprintf(filename,"%s\%s",acPath,fileinfo.name);
  381. show_picture(filename);
  382. }
  383. else
  384. {
  385. done = _findfirst(acMask, &fileinfo);
  386. if(done != -1)
  387. {
  388. GFMDrawRectangle(50,300,669,24, 0xff000000, 1);
  389. FNTDrawText(0xff00ff00,24,50, 300, fileinfo.name );
  390.                        /*取到了文件名,和acpath一起组成完整的路径,用fopen打开进行分析和显示*/
  391. sprintf(filename,"%s\%s",acPath,fileinfo.name);
  392. show_picture(filename);
  393. }
  394. }
  395. }
  396. break;
  397. case MSG_KeySELECT:
  398. break;
  399. default:;
  400. }
  401. }
  402. }
  403. void MainmenuKeyProcess(INT32U keycode)
  404. {
  405. T_Message msg;
  406. switch(keycode)
  407. {
  408. case VK_NEXT:
  409. msg.param0 = MSG_PGDOWN;
  410. DTOS_DRV_SendMessage( Test_queueID , &msg);
  411. break;
  412. case VK_PRIOR:
  413. msg.param0 = MSG_PGUP;
  414. DTOS_DRV_SendMessage( Test_queueID , &msg);
  415. break;
  416. case VK_UP:
  417. msg.param0 = MSG_KeyUP;
  418. DTOS_DRV_SendMessage( Test_queueID , &msg);
  419. break;
  420. case VK_DOWN:
  421. msg.param0 = MSG_KeyDOWN;
  422. DTOS_DRV_SendMessage( Test_queueID , &msg);
  423. break;
  424. case VK_LEFT:
  425. msg.param0 = MSG_KeyLEFT;
  426. DTOS_DRV_SendMessage( Test_queueID , &msg);
  427. break;
  428. case VK_RIGHT:
  429. msg.param0 = MSG_KeyRIGHT;
  430. DTOS_DRV_SendMessage( Test_queueID , &msg);
  431. break;
  432. case VK_SELECT:
  433. msg.param0 = MSG_KeySELECT;
  434. DTOS_DRV_SendMessage( Test_queueID , &msg);
  435. break;
  436. default:
  437. msg.param0 = 1;
  438. msg.param1 = 1;
  439. msg.param2 = 1;
  440. msg.param3 = 1;
  441. DTOS_DRV_SendMessage( Test_queueID , &msg);
  442. break;
  443. }
  444. }
  445. /*********************************************************/
  446. /*                 这里是程序的入口                     */
  447. /*********************************************************/
  448. void MainTask_Init(int mode)
  449. {
  450. /*********************************************************/
  451. /*      注册键盘按键的回调函数,即每次有键按下都会      */
  452. /*       调用所注册的回调,在这里是 MainmenuKeyProcess   */
  453. /*********************************************************/
  454. registerDVBKeycodeCallback(MainmenuKeyProcess);
  455. /*********************************************************/
  456. /* 创建一个消息队列,队列深度为100,即容纳100个消息,   */
  457. /* 每个消息的大小为sizeof(T_Message)=16byte            */
  458. /*********************************************************/
  459. Test_queueID = DTOS_DRV_CreatQueue( 100 ,sizeof(T_Message));
  460. /*********************************************************/
  461. /* 创建一个任务,名称为DEMO,任务为demoTask             */
  462. /*********************************************************/
  463. DTOS_DRV_CreateTask( demoTask,0,0,"DEMO");
  464. }