回复【96楼】 正点原子 :
---------------------------------
哇~~
这么长,很吃Flash的,呵呵,我现在才看到,但已经完成了截屏函数了,很简单的一个,直接24位位图,从电脑上打开一个240×320的位图,用Winhex抄了文件头,然后读屏后把数据简单地补充在下面,这样截屏有局限,就是限制了屏幕分辨率,但节省了Flash,顺便上图和代码给大家忽悠一下。
代码如下:
DIR pic_dir;
FIL pic_fil;
FILINFO pic_filinfo;
//分解颜色函数
//输入颜色数值,分解为rgb
void recolor(u16 color,u8 *rgb)
{
u8 tr=0,tg=0,tb=0;
tb=(color&0x001f);
tb<<=1;
if(tb&0x10)tb+=1;
tg=((color&0x07e0)>>5);
tr=((color&0xf800)>>11);
tr<<=1;
if(tr&0x20)tr+=1;
tr=((float)tr/0x3f)*255;
tg=((float)tg/0x3f)*255;
tb=((float)tb/0x3f)*255;
rgb[0]=tb;
rgb[1]=tg;
rgb[2]=tr;
}
//简单截屏函数
//自动保存在“0:/picture”文件夹下,并以时间日期命名
//文件头数据表
const u8 bmp_head[54]=
{
0X42,0X4D,0X38,0X84,0X03,0X00,0X00,0X00,
0X00,0X00,0X36,0X00,0X00,0X00,0X28,0X00,
0X00,0X00,0XF0,0X00,0X00,0X00,0X40,0X01,
0X00,0X00,0X01,0X00,0X18,0X00,0X00,0X00,
0X00,0X00,0X02,0X84,0X03,0X00,0XC3,0X0E,
0X00,0X00,0XC3,0X0E,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,
};
const u8 bmp_end[2]=
{
0x00,0x00,
};
extern u8 jpg_buffer[1024];
//保存成功返回0,不成功返回1
u8 Screen_Shoot(void)
{
UINT byte;
u8 temp[6];
u8 rgb[3];
u32 filecount=0;
u8 res=0;
u16 x,y;
char *lujing=(char*)jpg_buffer;
//测试
rgb[0]=100;
rgb[1]=200;
rgb[2]=50;
if(f_opendir(&pic_dir,"0:/PICTURE")!=FR_OK)
{
f_mkdir("0:/PICTURE");//创建文件夹
f_opendir(&pic_dir,"0:/PICTURE");//重新打开文件夹
}
//核算文件个数
while(1)
{
if(f_readdir(&pic_dir,&pic_filinfo)==FR_OK)
{
if(pic_filinfo.fname[0]!='.')filecount++;
if(pic_filinfo.fname[0]==NULL)break;
}
}
//合成路径
strcpy(lujing,"0:/PICTURE/");
strcat(lujing,"IMG");
temp[0]=(filecount/10000)+'0';
temp[1]=(filecount%10000/1000)+'0';
temp[2]=(filecount%1000/100)+'0';
temp[3]=(filecount%100/10)+'0';
temp[4]=(filecount%10)+'0';
temp[5]='\0';
strcat(lujing,(char*)temp);
strcat(lujing,".BMP");
if(f_open(&pic_fil,(TCHAR*)lujing,FA_OPEN_ALWAYS|FA_WRITE)!=FR_OK)res=1;//创建24位位图文件
if(f_write(&pic_fil,bmp_head,54,&byte)!=FR_OK)res=1;//写入文件头
//开始写颜色数据
for(y=320;y>0;y--)
{
for(x=0;x<240;x++)
{
recolor(rdot(x,(y-1)),rgb);
if(f_write(&pic_fil,rgb,3,&byte)!=FR_OK)res=1;//写入颜色数据
}
}
if(f_write(&pic_fil,bmp_end,2,&byte)!=FR_OK)res=1;//写入结尾数据
if(f_close(&pic_fil)!=FR_OK)res=1;//保存
return res;
}
|