金牌会员
 
- 积分
- 2285
- 金钱
- 2285
- 注册时间
- 2017-8-24
- 在线时间
- 375 小时
|
三月份的时候参加了一个嵌入式的比赛,然后买了几块正点原子的开发板,做的一个项目是摄像头巡线小车,外加实时图传,超声波测距,红外控制,额,好像讲多了直接切入正题,关于开发板全屏截图的事,因为之前看过照相机程序,看了一下保存屏幕像素点到bmp图像的程序,不得不说,正点原子的代码就是好,留出的接口
和扩展很强,大概就是这一个函数吧,首先是生成不会重复的名称(路径),基于时间的camera_new_pathname(pname);接着判断名称生成是否成功if(pname!=NULL),接着
判断BMP编码这一块区域的返回值,就是有没有成功if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0)),这时候没有错误的时候就已经把
图片存进SD卡了
接下来就是对这个函数的改造了,先看一下bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0)这个函数,当然这是已经调用的了,有了参数,
原版是这样的,u8 bmp_encode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 mode);下面是说明
//BMP编码函数
//将当前LCD屏幕的指定区域截图,存为16位格式的BMP文件 RGB565格式.
//保存为rgb565则需要掩码,需要利用原来的调色板位置增加掩码.这里我们已经增加了掩码.
//保存为rgb555格式则需要颜色转换,耗时间比较久,所以保存为565是最快速的办法.
//filename:存放路径
//x,y:在屏幕上的起始坐标
//mode:模式.0,仅仅创建新文件的方式编码;1,如果之前存在文件,则覆盖之前的文件.如果没有,则创建新的文件.
//返回值:0,成功;其他,错误码.
第一个,前面我们用的时间来作为名称,因为不会重复,然后我们只需要把起始坐标设置0,0,宽和高设置成自己的屏幕宽高,如果说你还需要换屏幕,说的高大上一点就是提高兼容性的话
可以使用LCD屏幕里面的宽高的参数,就是
//LCD重要参数集
typedef struct
{
u16 width; //LCD 宽度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
u16 wramcmd; //开始写gram指令
u16 setxcmd; //设置x坐标指令
u16 setycmd; //设置y坐标指令
}_lcd_dev; 或者
首先需要包含lcd.h头文件
然后就是在需要的地方调用这个bmp编码函数
在这里写成一个函数封装起来
//文件名自增(避免覆盖)
//组合成:形如"0 HOTO/PIC13141.bmp"的文件名
void Screenshot_new_pathname(u8 *pname)
{
u8 res;
u16 index=0;
while(index<0XFFFF)
{
sprintf((char*)pname,"0:SCREENSHOTS/PIC%05d.bmp",index);
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
if(res==FR_NO_FILE)break; //该文件名不存在=正是我们需要的.
index++;
}
}
u8*const screenshot_remind_tbl[GUI_LANGUAGE_NUM]=
{
"截图保存成功",
"嶻圗保存成功",
"Screenshot save succeed",
};
void screenshot()
{
u8 *pname;
pname=mymalloc(SRAMIN,30);
Screenshot_new_pathname(pname);
if((KEY0==0)&&(KEY1==0))
{
delay_ms(10);
if((KEY0==0)&&(KEY1==0))
{
if(bmp_encode(pname,(lcddev.width-480)/2,(lcddev.height-800)/2,480,800,0)){;}
BEEP=1;delay_ms(100);BEEP=0;
}
}
window_msg_box((lcddev.width-200)/2,(lcddev.height-80)/2,200,80,(u8*)screenshot_remind_tbl[gui_phy.language],"提示信息",12,0,0,0);
while((KEY0==0)&&(KEY1==0));
myfree(SRAMIN,pname);
}
该功能需要同时点住KEY0和KEY1键,听到“嘀“的一声就松开手,然后就可以存下截图了,还会有一个截图成功的对话框。
可以使用一个中断或者信号量什么的,在那里调用screenshot这个函数,大概就是这样吧
所有的开发板应该都可以,不过没钱买那么多,哈哈哈,也可以支持操作系统,但是需要包含bmp编码及rtc和sd卡等的c和h文件,具体效果大家试一试
最后配上几张图
pic1
pic2
(可能程序修改的有点多了)
好吧,这个界面是我改过的,刚才才发现存截图的那个U盘忘带了,但是回去又没网,先看这两张吧,下次多带几张
|
|