|
发表于 2017-8-22 15:02:03
|
显示全部楼层
回 hpei2003 的帖子
hpei2003:问题在哪里呢?
1..bmp格式
2.读像素函数问题?
(2017-08-22 14:42)  都有可能,什么读像素,SD卡写入等等,都有可能有问题。这个是我早期做的裸机的BMP截图,可以参考,现在很少用裸机了,都是emWin全套实现。
文件头:- /*************************BMP信息头 40字节***************************/
- typedef __packed struct
- {
- DWORD biSize ; //说明BITMAPINFOHEADER结构所需要的字数。
- LONG biWidth ; //说明图象的宽度,以象素为单位
- LONG biHeight ; //说明图象的高度,以象素为单位
- WORD biPlanes ; //为目标设备说明位面数,其值将总是被设为1
- WORD biBitCount ; //说明比特数/象素,其值为1、4、8、16、24、或32
- DWORD biCompression ; //说明图象数据压缩的类型。其值可以是下述值之一:
- //BI_RGB:没有压缩;
- //BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
- //BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
- //BI_BITFIELDS:每个象素的比特由指定的掩码决定。
- DWORD biSizeImage ; //说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0
- LONG biXPelsPerMeter ;//说明水平分辨率,用象素/米表示
- LONG biYPelsPerMeter ;//说明垂直分辨率,用象素/米表示
- DWORD biClrUsed ; //说明位图实际使用的彩色表中的颜色索引数
- DWORD biClrImportant ; //说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
- }BITMAPINFOHEADER ;
- /*************************BMP头文件 14字节***************************/
- typedef __packed struct
- {
- WORD bfType ; //文件标志.只对'BM',用来识别BMP位图类型
- DWORD bfSize ; //文件大小,占四个字节
- WORD bfReserved1 ; //保留
- WORD bfReserved2 ; //保留
- DWORD bfOffBits ; //从文件开始到位图数据(bitmap data)开始之间的的偏移量
- }BITMAPFILEHEADER ;
- /*************************位图信息头 54字节*************************/
- typedef __packed struct
- {
- BITMAPFILEHEADER bmfHeader;
- BITMAPINFOHEADER bmiHeader;
- }BITMAPINFO;
复制代码 函数:- /*
- *********************************************************************************************************
- * 函 数 名: GUI_Copy_ScreenRect()
- * 功能说明: 屏幕截图,然后以bmp图片格式(为24位高真彩位图)保存到指定的路径下
- * 形 参:x:X坐标 y:y坐标 sizex:长度 sizey:宽度
- * *Save_Path:保存路径,其中文件名后缀必须为bmp
- * 例如:"0:/Picture/abcd.bmp" 注意!!:路径"0:/0:/Picture"必须存在
- * 否则该函数调用无效。
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void GUI_SaveBMP(uint16_t startx,uint16_t starty,uint16_t sizex,uint16_t sizey,void *Save_Path)
- {
- uint32_t size = (sizex*sizey)*3;//-- 由于是24为BMP位图,一个像素占3个字节,所以要乘以3
- uint16_t Header_num = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
- int16_t i = 0,j = 0,temp = 0,count = 0;
- uint16_t Buffer_num = 510;
- BITMAPFILEHEADER BmpFileHeader;
- BITMAPINFOHEADER BmpInfoHeader;
-
- /*------------------------------- 建立文件头数据 -----------------------------------------*/
- BmpFileHeader.bfType = 0x4D42;//--文件标志.只对'BM',用来识别BMP位图类型
- BmpFileHeader.bfSize = size + Header_num;//--文件大小,占四个字节
- BmpFileHeader.bfReserved1 = 0; //--保留字段1
- BmpFileHeader.bfReserved2 = 0; //--保留字段2
- BmpFileHeader.bfOffBits = Header_num;//--从文件开始到位图数据(bitmap data)开始之间的的偏移量
- /*------------------------------- 建立文件信息数据 ---------------------------------------*/
- BmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);//--说明BITMAPINFOHEADER结构所需要的字数
- BmpInfoHeader.biWidth = sizex; //--说明图象的宽度,以象素为单位
- BmpInfoHeader.biHeight = sizey; //--说明图象的高度,以象素为单位
- BmpInfoHeader.biPlanes = 1; //--为目标设备说明位面数,其值将总是被设为1
- BmpInfoHeader.biBitCount = 24; //--说明比特数/象素,其值为1、4、8、16、24、或32
- BmpInfoHeader.biCompression = 0; //--说明图象数据压缩的类型,无压缩
- BmpInfoHeader.biSizeImage = size; //--说明图象的大小(必须是4的倍数),以字节为单位。
- //--当用BI_RGB格式时,可设置为0
- BmpInfoHeader.biXPelsPerMeter = 0;//--说明水平分辨率,用象素/米表示
- BmpInfoHeader.biYPelsPerMeter = 0;//--说明垂直分辨率,用象素/米表示
- BmpInfoHeader.biClrUsed = 0;//--说明位图实际使用的彩色表中的颜色索引数
- BmpInfoHeader.biClrImportant = 0;//--说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要
- /*-------------------------- 创建保存截图数据的文件 ------------------------------------*/
- if (f_open(&FileSave,Save_Path, FA_WRITE|FA_CREATE_ALWAYS) == FR_OK )
- {
- //--先写图像头数据和图像信息数据
- result = f_write (&FileSave,&BmpFileHeader,sizeof(BmpFileHeader),&bw);
- if (result != FR_OK)
- {
- return;
- }
-
- result = f_write (&FileSave,&BmpInfoHeader,sizeof(BmpInfoHeader),&bw);
- if (result != FR_OK)
- {
- return;
- }
- for(j = sizey-1; j >= 0; j--)
- {
- for(i = 0; i < sizex; i++)
- {
- temp = LCD_GetPixel(startx+i,starty+j);
- data[count+2] = (u8)((temp&0xf800)>>8);
- data[count+1] = (u8)((temp&0x7e0)>>3);
- data[count] = (u8)((temp&0x1f)<<3);
- count += 3;
- if(count == Buffer_num)
- {
- count = 0;
- result = f_write (&FileSave,data,Buffer_num,&bw);
- if (result != FR_OK)
- {
- return;
- }
- }
- }
- }
- if(count > 0) f_write (&FileSave,data,count,&bw);
- f_close(&FileSave);
- }
- }
复制代码 |
|