#include "osg.h"
#include<stdio.h>
#include <io.h>
UINT32 Test_queueID;
typedef struct BMP_Filehead
{
UINT32 Size; //文件大小
UINT16 Reserve1; //备用单元1
UINT16 Reserve2; //备用单元2
UINT32 Offbits; //图像开始处的字节偏移
}BMP_File;
typedef struct BMP_Info
{
UINT32 biSize; //图像头大小,40字节
UINT32 biWidth; //图像宽度
UINT32 biHeight; //图像高度
UINT16 biPlanes; //图像面数
UINT16 biBitcount; //每像素位数
UINT32 bicompression; //压缩类型
UINT32 biXpelspermeter; //水平分辨率
UINT32 biYpelspermeter; //垂直分辨率
UINT32 biClrused; //使用的色彩数
UINT32 biClrimportant; //重要色彩数
}BMP_Info;
typedef struct RGB_type
{
UINT8 Blue;
UINT8 Green;
UINT8 Red;
UINT8 Reserved;
}RGB_BMP_typ;
FILE *fp;
struct BMP_Filehead header; //文件头定义
struct BMP_Info headinfo; //信息头定义
struct RGB_type palette[256];
UINT8 *nc,*v;
UINT32 width,height,count,color[256],perline,offbits,i,j,k,m,n,h; //对多个函数中的公用变量的定义//
Bmp_display(FILE *fp)
{
if(fp==NULL)
exit(1);
else
{
fseek(fp,2,0);
fread(&header,12,1,fp); //读取文件头信息//
fseek(fp,14,0); //偏移//
fread(&headinfo,40,1,fp); //读取信息头//
width=headinfo.biWidth;
height=headinfo.biHeight;
count=headinfo.biBitcount;
perline=(width*count+31)/32*4; //一行占字节数//
offbits=header.Offbits;
if(headinfo.bicompression!=0x0000) //判断文件是否压缩
{
FNTDrawText(0x00ff0000,10,200, 250, "Can not show a compressed picture!" );
}
if(count==1)
{
UINT8 y[100000];
fseek(fp,54,0); //偏移倒调色板区
for(i=0;i<2;i++) //读取调色板信息
{
fread(palette+i,4,1,fp);
v=&color[i];
*v=palette[i].Blue;v++;
*v=palette[i].Green;v++;
*v=palette[i].Red;v++;
}
nc=(UINT8*)malloc(perline); //申请内存
if(nc==NULL)
exit(1);
else
{
for(j=0;j<height;j++)
{
fseek(fp,62+(height-1-j)*perline,0);
fread(nc,1,perline,fp); //读取一行图象数据
for(i=0;i<perline;i++)
{
y[8*i]=nc[i]&128;
y[8*i]=y[8*i]>>7;
y[8*i+1]=nc[i]&64;
y[8*i+1]=y[8*i+1]>>6;
y[8*i+2]=nc[i]&32;
y[8*i+2]=y[8*i+2]>>5;
y[8*i+3]=nc[i]&16;
y[8*i+3]=y[8*i+3]>>4;
y[8*i+4]=nc[i]&8;
y[8*i+4]=y[8*i+4]>>3;
y[8*i+5]=nc[i]&4;
y[8*i+5]=y[8*i+5]>>2;
y[8*i+6]=nc[i]&2;
y[8*i+6]=y[8*i+6]>>1;
y[8*i+7]=nc[i]&1;
}
for(i=0;i<width;i++) //描点法显示图像
{
n=y[i];
GFMSetPixels(color[n],i,j,1);
}
}
fclose(fp);
free(nc);
}
}
else if(count==4)
{
fseek(fp,54,0);
for(i=0;i<16;i++) //读取调色板信息//
{
fread(palette+i,4,1,fp);
v=&color[i];
*v=palette[i].Blue;v++;
*v=palette[i].Green;v++;
*v=palette[i].Red;v++;
}
nc=(UINT8*)malloc(perline);
for(i=0;i<height;i++)
{
fseek(fp,118+(height-i-1)*perline,0);
fread(nc,1,perline,fp);
for(j=0;j<perline;j++)
{
m=nc[j]/16;
n=nc[j]%16;
GFMSetPixels(color[m],j*2,i,1);
GFMSetPixels(color[n],j*2+1,i,1);
}
}
fclose(fp);
free(nc);
}
else if(count==8)
{
fseek(fp,54,0); //偏移54字节到调色板区
for(i=0;i<256;i++) //读取调色板信息//
{
fread(palette+i,4,1,fp);
v=&color[i];
*v=palette[i].Blue;v++;
*v=palette[i].Green;v++;
*v=palette[i].Red;v++;
}
nc=(UINT8*)malloc(perline);
//if(nc!=NULL)
//{
for(i=height;i>0;i--)
{
fseek(fp,1078+(i-1)*perline,0); //将指针移到图象存储区
fread(nc,1,perline,fp);//将一行图象数据读入内存
for(j=0;j<width;j++)
GFMSetPixels(color[nc[j]],j,height-i,1);//逐点显示
}
//}
fclose(fp);
free(nc);
}
else if(count==24)
{
UINT32 *p;
p=&h;
fseek(fp,54,0);
nc=(UINT8*)malloc(perline);
for(i=0;i<height;i++)
{
fseek(fp,54+(height-1-i)*perline,0);
fread(nc,1,perline,fp);
for(j=0;j<width;j++)
{
v=(UINT8*)p;
for(k=0;k<3;k++,v++)
{
*v=*(nc+(width-j-1)*3+k); //获取每个像素的颜色信息
GFMSetPixels(h,width-j,i,1);
}
}
}
fclose(fp);
free(nc);
}
}
}
void demoTask()
{
T_Message RecvMsg;
unsigned char acMask[200],acFile[200],acPath[200];
int k=0;
UINT8 *pTemp;
struct _finddata_t fileinfo;
long done;
getcwd(acPath, sizeof(acPath));
sprintf(acPath, "C:\\Program Files\\图片",acPath); //文件路径
sprintf(acMask, "%s\\*.bmp",acPath);
while(1)
{
done = _findfirst(acMask, &fileinfo);
if (done != -1)
{
do
{
GFMDrawRectangle(0,0,720,576,0xff000000,1);
sprintf(acFile, "%s\\%s", acPath, fileinfo.name);
{
FILE *fp = fopen(acFile, "rb");
Bmp_display(fp);
FNTDrawText(0x00ff0000, 0, 20, 500, acFile);
}
DTOS_DRV_DelayTask(1000);
} while (_findnext(done, &fileinfo) == 0);
}
}
}
void MainmenuKeyProcess(UINT32 keycode)
{
UINT8 i;
T_Message msg;
switch(keycode)
{
default:
msg.param0 = 1;//this is just for demonstration
msg.param1 = 1;
msg.param2 = 1;
msg.param3 = 1;
DTOS_DRV_SendMessage( Test_queueID , &msg);
break;
}
}
void MainTask_Init(int mode)
{
//it is just a sample;You can add your own code here.
registerDVBKeycodeCallback(MainmenuKeyProcess);
Test_queueID = DTOS_DRV_CreatQueue( 100 );
DTOS_DRV_CreateTask( demoTask,0,0,0,"DEMO");
}
评论0