硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2549|回复: 7
收起左侧

STM32F407截屏问题

[复制链接]

8

主题

54

回帖

78

积分

初级会员

~

积分
78
QQ
发表于 2018-4-12 11:34:10 | 显示全部楼层 |阅读模式
图形界面用的是emWin,文件系统是Fatfs,操作系统是UC/OS-III,现在出现的问题是这样的:我需要截屏,但是不是截整个屏,屏是240(width)x320(hight),我需要截下半部分的屏,也就是从50~320行,第0~50行不截。然后我在截屏的时候添加了一个进度条PROGBAR窗口,保存的图片为BMP格式的图片,在每次写file的时候会刷新一下进度条。当我把PROGBAR的位置放在0~50行之间的时候,图片保存正常,用GUI_BMP_Draw绘制出来正常;当我把PROGBAR的位置放在底部300~320之间时(PROGBAR窗口为240x10,未超屏幕边界),图片保存不正常,GUI_BMP_Draw绘制出来不正常,图片对角线一条线,然后一半灰一半白。如果在写file的时候不调用图形界面刷新,保存图片又是正常的,这是什么原因?是因为Paint的原因导致图像变了么?求大神指导
~~~~~
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-4-12 12:08:04 | 显示全部楼层
你要截图的区域,不能更新东西。
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

~

积分
78
QQ
 楼主| 发表于 2018-4-12 13:23:32 | 显示全部楼层
本帖最后由 like_888 于 2018-4-12 13:25 编辑
eric2013 发表于 2018-4-12 12:08
你要截图的区域,不能更新东西。

我描述反了,PROGBAR在截图区域之外,截下来的图片两个颜色,进度条的灰白色,用对角线划开来了。PROGBAR_Create(0,0,240,10,WM_CF_SHOW),截图区域是(0,25,240,280),就是从25行开始,截的图片尺寸是240*280。如果在写file的时候不Paint进度条,图片就保存正常,GUI_BMP_Draw绘制出来正常。我查了下资料,是不是因为位图在文件中的排序是从下到上的原因导致
~~~~~
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

~

积分
78
QQ
 楼主| 发表于 2018-4-12 14:37:40 | 显示全部楼层
eric2013 发表于 2018-4-12 12:08
你要截图的区域,不能更新东西。

如图所示,我截取中间部分,我进度条在底下②区域,保存图片正常。如果进度条在①区域,保存图片就不正常
QQ截图20180412143503.png
~~~~~
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-4-12 14:40:38 | 显示全部楼层
like_888 发表于 2018-4-12 14:37
如图所示,我截取中间部分,我进度条在底下②区域,保存图片正常。如果进度条在①区域,保存图片就不正常 ...

这样的话,那没问题的,回头我也试试看,你用的那个函数保存的。
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

~

积分
78
QQ
 楼主| 发表于 2018-4-12 15:27:39 | 显示全部楼层
  1. uint8_t Screen_shot(uint16_t x, uint16_t y, uint16_t width, uint16_t height, char *filename, FUNC prog)
  2. {   
  3.     long file_size;
  4.     long data_size;
  5.     unsigned char widthAlignBytes;uint16_t Vpix[240];
  6.     int i;
  7.     FIL bmpfsrc;
  8.     unsigned int mybw;
  9.    
  10.     uint16_t j;

  11.     // 文件头
  12.     unsigned char header[66] =
  13.     {
  14.         // BITMAPFILEINFO
  15.         'B', 'M',               // [0-1] bfType:必须是BM字符
  16.         0, 0, 0, 0,             // [2-5] bfSize:总文件大小
  17.         0, 0, 0, 0,             // [6-9] brReserved1,bfReserved2:保留
  18.         sizeof(header), 0, 0, 0,// [10-13] bfOffBits:到图像数据的偏移
  19.         // BITMAPFILEHEADER
  20.         0x28, 0, 0, 0,          // [14-17] biSize:BITMAPINFOHEADER大小40字节
  21.         0, 0, 0, 0,             // [18-21] biWidth:图片宽度
  22.         0, 0, 0, 0,             // [22-25] biHeight:图片高度
  23.         0x01, 0,                // [26-27] biPlanes:必须为1
  24.         0x10, 0,                // [28-29] biBitCount:16位
  25.         0x03, 0, 0, 0,          // [30-33] biCompression:BI_BITFIELDS=3
  26.         0, 0, 0, 0,             // [34-37] biSizeImage:图片大小
  27.         0x12, 0x0B, 0, 0,       // [38-41] biXPelsPerMeter:单位长度内的像素数
  28.         0x12, 0x0B, 0, 0,       // [42-45] biYPelsPerMeter:单位长度内的像素数
  29.         0, 0, 0, 0,             // [46-49] biClrUsed:可用像素数,设为0即可
  30.         0, 0, 0, 0,             // [50-53] biClrImportant:重要颜色数,设为0即可
  31.         // RGBQUAD MASK
  32.         0x0, 0xF8, 0, 0,        // [54-57] 红色掩码
  33.         0xE0, 0x07, 0, 0,       // [58-61] 绿色掩码
  34.         0x1F, 0, 0, 0           // [62-65] 蓝色掩码
  35.     };

  36.     widthAlignBytes = ((width * 16 + 31) & ~31) / 8; // 每行需要的合适字节个数
  37.     data_size = widthAlignBytes * height;      // 图像数据大小
  38.     file_size = data_size + sizeof(header);    // 整个文件的大小

  39.     *((long *)(header + 2)) = file_size;
  40.     *((long *)(header + 18)) = width;
  41.     *((long *)(header + 22)) = height;
  42.     *((long *)(header + 34)) = data_size;

  43.     f_open(&bmpfsrc , (char*)filename, FA_CREATE_NEW | FA_WRITE );
  44.     f_close(&bmpfsrc);
  45.     if( f_open( &bmpfsrc , (char*)filename, FA_OPEN_EXISTING | FA_WRITE) == FR_OK)
  46.     {
  47.         f_write(&bmpfsrc, header, sizeof(header), &mybw); //写头信息

  48.         if (widthAlignBytes == width * 2)
  49.         {
  50.             //ILI9341_GetMultiPixel(0,0,(size_t)data_size,Vpix);//一行
  51.             for(j = 0; j < 240; j++)Vpix[j] = ILI9341_GetPixel(x + j, y + 0);
  52.             f_write(&bmpfsrc, Vpix, (size_t)data_size, &mybw);
  53.         }
  54.         else
  55.         {
  56.             // 每一行单独写入
  57.             const static DWORD DWZERO = 0;
  58.             for (i = height - 1; i >= 0; i--)
  59.             {
  60.                 //ILI9341_GetMultiPixel(0,i,(size_t) width,Vpix);//一行
  61.                 for(j = 0; j < width; j++)Vpix[j] = ILI9341_GetPixel(x + j, y + i);
  62.                 f_write(&bmpfsrc, Vpix, (size_t) width * 2, &mybw);
  63.                 f_write(&bmpfsrc, &DWZERO, widthAlignBytes - width * 2, &mybw);

  64.                 prog(100 * (height - i) / height);        //进度条

  65.             }
  66.         }
  67.         f_close(&bmpfsrc);
  68.         return TRUE;
  69.     }
  70.     else
  71.         return FALSE;
  72. }
复制代码

eric2013 发表于 2018-4-12 14:40
这样的话,那没问题的,回头我也试试看,你用的那个函数保存的。


~~~~~
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

~

积分
78
QQ
 楼主| 发表于 2018-4-14 10:14:50 | 显示全部楼层
eric2013 发表于 2018-4-12 14:40
这样的话,那没问题的,回头我也试试看,你用的那个函数保存的。

硬汉,帮我看下我的截屏函数有没有问题,多谢了
~~~~~
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-4-16 00:50:44 | 显示全部楼层
like_888 发表于 2018-4-14 10:14
硬汉,帮我看下我的截屏函数有没有问题,多谢了

推荐你使用emWin自带的函数
GUI_BMP_SerializeEx
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 08:19 , Processed in 0.044700 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表