硬汉嵌入式论坛

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

请教f429裸机怎么截图

[复制链接]

22

主题

26

回帖

92

积分

初级会员

积分
92
发表于 2017-10-8 16:49:36 | 显示全部楼层 |阅读模式
请教f429裸机怎么截图?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2017-10-9 10:10:23 | 显示全部楼层
读取显存的数据,按照BMP的格式存储到SD卡里面即可,可以参考早期给V5版本弄的一个裸机截图代码,只是这里的截图数据是RA8875的显存。

  1. /*
  2. ************************************************************************
  3. *                          用于SD卡
  4. ************************************************************************
  5. */
  6. uint8_t data[1024];
  7. FRESULT result;
  8. FIL file;
  9. FIL FileSave; //专门用于图片的保存
  10. FILINFO finfo;
  11. DIR DirInf;
  12. UINT bw;
  13. FATFS fs;


  14. /*
  15. *********************************************************************************************************
  16. *    函 数 名: DispBMP
  17. *    功能说明: 每次读取512字节,然后显示,如果使用内存管理还是很好的,这里没使用。
  18. *    形    参:S_xpos    BMP图片显示X轴
  19. *              S_ypos    BMP图片显示Y轴
  20. *             filename    文件名
  21. *    返 回 值: 无
  22. *********************************************************************************************************
  23. */
  24. void GUI_DrawBMP(uint8_t S_xpos,uint16_t S_ypos,TCHAR *filename)
  25. {   
  26.     BITMAPINFO *pbmp;
  27.     uint16_t  COLOR=0,tmp_color=0,countpix=0;
  28.     uint8_t   color_byte,rgb=0;
  29.     uint16_t  uiTemp,Xpos,Ypos;
  30.     uint32_t  pointpos=0,count,DataSize;


  31.     /* 打开文件 */        
  32.     result = f_open(&file,filename, FA_OPEN_EXISTING | FA_READ|FA_OPEN_ALWAYS);
  33.     if (result != FR_OK)
  34.     {
  35.         return;
  36.     }

  37.     /* 读数据 */
  38.     result = f_read(&file, data, 512, &bw);
  39.     if (result != FR_OK)
  40.     {
  41.         return;
  42.     }

  43.     pbmp=(BITMAPINFO*)data;                                                  
  44.     count=pbmp->bmfHeader.bfOffBits;                                    
  45.     color_byte=pbmp->bmiHeader.biBitCount/8;                              
  46.     DataSize=pbmp->bmiHeader.biWidth*pbmp->bmiHeader.biHeight*color_byte;
  47.    
  48.     if((pbmp->bmiHeader.biWidth*color_byte)%4)
  49.         uiTemp=((pbmp->bmiHeader.biWidth*color_byte)/4+1)*4;
  50.     else
  51.         uiTemp=pbmp->bmiHeader.biWidth*color_byte;

  52.      Xpos = S_xpos;
  53.     Ypos = pbmp->bmiHeader.biHeight-1+S_ypos;         
  54.    
  55.     RA8875_SetCursor(Xpos, Ypos);
  56.     RA8875_REG = 0x02;
  57.             
  58.     while(1)
  59.    {
  60.      while(count<512)
  61.      {
  62.           if(color_byte==3)   
  63.             {
  64.                 switch (rgb)
  65.                 {
  66.                     case 0:
  67.                         tmp_color = data[count]>>3 ;
  68.                         COLOR |= tmp_color;
  69.                         break ;      
  70.                     case 1:
  71.                         tmp_color = data[count]>>2 ;
  72.                         tmp_color <<= 5 ;
  73.                         COLOR |= tmp_color ;
  74.                         break;      
  75.                     case 2 :
  76.                         tmp_color = data[count]>>3 ;
  77.                         tmp_color <<= 11 ;
  78.                         COLOR |= tmp_color ;
  79.                         break ;            
  80.                 }   
  81.             }
  82.               if(color_byte==2)  
  83.                 {
  84.                     switch(rgb)
  85.                     {
  86.                         case 0 :
  87.                             COLOR=data[count]&0x1f;
  88.                             tmp_color=data[count]>>5;
  89.                             tmp_color<<=6;
  90.                             COLOR|=tmp_color;
  91.                             break ;   
  92.                         case 1 :               
  93.                             tmp_color=data[count];
  94.                             tmp_color<<=9 ;
  95.                             COLOR |= tmp_color ;
  96.                             break ;     
  97.                     }            
  98.                 }
  99.             if(color_byte==4)
  100.                 {
  101.                     switch (rgb)
  102.                         {
  103.                             case 0 :  
  104.                                 tmp_color=data[count];
  105.                                 COLOR|=tmp_color>>3;
  106.                                 break ;     
  107.                             case 1 :  
  108.                                 tmp_color=data[count];
  109.                                 tmp_color>>=2;
  110.                                 COLOR|=tmp_color<<5;
  111.                                 break ;      
  112.                             case 2 :  
  113.                                 tmp_color=data[count];
  114.                                 tmp_color>>=3;
  115.                                 COLOR|=tmp_color<<11;
  116.                                 break ;     
  117.                             case 3 :break ;   
  118.                         }               
  119.                     }     
  120.             rgb++;      
  121.             count++;         
  122.             if(rgb==color_byte)
  123.             {                                                                        
  124.                 RA8875_RAM = COLOR;                                            
  125.                 COLOR=0x00;
  126.                 rgb=0;            
  127.             }
  128.             countpix++;
  129.             pointpos++;
  130.             
  131.             if(pointpos>=DataSize)
  132.             {
  133.                 f_close(&file);
  134.                 return;
  135.             }
  136.             if(countpix>=uiTemp)
  137.             {         
  138.                 RA8875_SetCursor(S_xpos, --Ypos);
  139.                 RA8875_REG = 0x02;
  140.                 countpix=0;
  141.             }
  142.          }
  143.           result = f_read(&file, data, 512, &bw);
  144.           if (result != FR_OK)
  145.          {
  146.             return;
  147.          }
  148.           count=0;
  149.        }

  150. }

  151. /*
  152. *********************************************************************************************************
  153. *    函 数 名: GUI_Copy_ScreenRect()
  154. *    功能说明: 屏幕截图,然后以bmp图片格式(为24位高真彩位图)保存到指定的路径下
  155. *    形    参:x:X坐标   y:y坐标   sizex:长度   sizey:宽度
  156. *             *Save_Path:保存路径,其中文件名后缀必须为bmp
  157. *             例如:"0:/Picture/abcd.bmp" 注意!!:路径"0:/0:/Picture"必须存在
  158. *             否则该函数调用无效。               
  159. *    返 回 值: 无
  160. *********************************************************************************************************
  161. */
  162. void GUI_SaveBMP(uint16_t startx,uint16_t starty,uint16_t sizex,uint16_t sizey,void *Save_Path)
  163. {
  164.     uint32_t    size = (sizex*sizey)*3;//-- 由于是24为BMP位图,一个像素占3个字节,所以要乘以3
  165.     uint16_t    Header_num = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  166.     int16_t     i = 0,j = 0,temp = 0,count = 0;
  167.     uint16_t     Buffer_num = 510;


  168.     BITMAPFILEHEADER      BmpFileHeader;
  169.     BITMAPINFOHEADER     BmpInfoHeader;
  170.    

  171.     /*------------------------------- 建立文件头数据 -----------------------------------------*/
  172.     BmpFileHeader.bfType      = 0x4D42;//--文件标志.只对'BM',用来识别BMP位图类型
  173.     BmpFileHeader.bfSize       = size + Header_num;//--文件大小,占四个字节
  174.     BmpFileHeader.bfReserved1 = 0;                  //--保留字段1
  175.     BmpFileHeader.bfReserved2 = 0;                  //--保留字段2
  176.     BmpFileHeader.bfOffBits   = Header_num;//--从文件开始到位图数据(bitmap data)开始之间的的偏移量
  177.     /*------------------------------- 建立文件信息数据 ---------------------------------------*/
  178.     BmpInfoHeader.biSize   = sizeof(BITMAPINFOHEADER);//--说明BITMAPINFOHEADER结构所需要的字数
  179.     BmpInfoHeader.biWidth  = sizex;   //--说明图象的宽度,以象素为单位
  180.     BmpInfoHeader.biHeight = sizey;   //--说明图象的高度,以象素为单位
  181.     BmpInfoHeader.biPlanes = 1;          //--为目标设备说明位面数,其值将总是被设为1
  182.     BmpInfoHeader.biBitCount = 24;    //--说明比特数/象素,其值为1、4、8、16、24、或32
  183.     BmpInfoHeader.biCompression = 0;  //--说明图象数据压缩的类型,无压缩
  184.     BmpInfoHeader.biSizeImage = size; //--说明图象的大小(必须是4的倍数),以字节为单位。
  185.                                         //--当用BI_RGB格式时,可设置为0
  186.     BmpInfoHeader.biXPelsPerMeter = 0;//--说明水平分辨率,用象素/米表示
  187.     BmpInfoHeader.biYPelsPerMeter = 0;//--说明垂直分辨率,用象素/米表示
  188.     BmpInfoHeader.biClrUsed          = 0;//--说明位图实际使用的彩色表中的颜色索引数
  189.     BmpInfoHeader.biClrImportant  = 0;//--说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要
  190.     /*-------------------------- 创建保存截图数据的文件  ------------------------------------*/
  191.     if (f_open(&FileSave,Save_Path, FA_WRITE|FA_CREATE_ALWAYS) == FR_OK )
  192.     {   
  193.             //--先写图像头数据和图像信息数据
  194.             result = f_write (&FileSave,&BmpFileHeader,sizeof(BmpFileHeader),&bw);
  195.             if (result != FR_OK)
  196.             {
  197.                 return;
  198.             }
  199.             
  200.             result = f_write (&FileSave,&BmpInfoHeader,sizeof(BmpInfoHeader),&bw);
  201.             if (result != FR_OK)
  202.             {
  203.                 return;
  204.             }
  205.             for(j = sizey-1; j >= 0; j--)
  206.             {            
  207.                      for(i = 0; i < sizex; i++)
  208.                      {
  209.                             temp = LCD_GetPixel(startx+i,starty+j);
  210.                             data[count+2] = (u8)((temp&0xf800)>>8);
  211.                             data[count+1] = (u8)((temp&0x7e0)>>3);
  212.                             data[count]   = (u8)((temp&0x1f)<<3);
  213.                             count += 3;
  214.                             if(count == Buffer_num)
  215.                             {
  216.                                     count = 0;
  217.                                     result = f_write (&FileSave,data,Buffer_num,&bw);
  218.                                     if (result != FR_OK)
  219.                                     {
  220.                                         return;
  221.                                     }        
  222.                             }
  223.                      }
  224.             }
  225.         if(count > 0)    f_write (&FileSave,data,count,&bw);
  226.         f_close(&FileSave);            
  227.      }
  228. }
复制代码
回复

使用道具 举报

22

主题

26

回帖

92

积分

初级会员

积分
92
 楼主| 发表于 2017-11-13 11:37:40 | 显示全部楼层

回 eric2013 的帖子

eric2013:读取显存的数据,按照BMP的格式存储到SD卡里面即可,可以参考早期给V5版本弄的一个裸机截图代码,只是这里的截图数据是RA8875的显存。

/*
************************************************************************
*         &n .. (2017-10-09 10:10) 
液晶我用的是裸屏,F429自带显示屏控制器可以读取液晶读取点坐标的颜色值吗,类似上述代码中的  LCD_GetPixel函数
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2017-11-14 00:54:11 | 显示全部楼层

回 beiqibing000 的帖子

beiqibing000:液晶我用的是裸屏,F429自带显示屏控制器可以读取液晶读取点坐标的颜色值吗,类似上述代码中的  LCD_GetPixel函数 (2017-11-13 11:37) 
可以的,直接读取显存就行了,如果是用的SDRAM做显存,直接读取SDRAM就行。
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
发表于 2020-7-30 17:46:05 | 显示全部楼层
eric2013 发表于 2017-11-14 00:54
可以的,直接读取显存就行了,如果是用的SDRAM做显存,直接读取SDRAM就行。

汉哥,我看了你的例子,然后也写了一份(从SDRAM读取),可以截图,然后图片的右侧四分一左右有雪花,如果是截取右半部分不会有这种情况。想请教你,这会是什么原因引起的。
(啊,图片怎么上传的。。。。图片地址,,要上传云吗。。。。。)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-7-31 08:34:57 | 显示全部楼层
WSTON 发表于 2020-7-30 17:46
汉哥,我看了你的例子,然后也写了一份(从SDRAM读取),可以截图,然后图片的右侧四分一左右有雪花,如果 ...

你用的什么平台,F429还是H7
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
发表于 2020-7-31 08:55:42 | 显示全部楼层
eric2013 发表于 2020-7-31 08:34
你用的什么平台,F429还是H7

用的是RT1052的,显存在SDRAM,截图大部分可以,就是右侧有横向的雪花
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-7-31 09:32:30 | 显示全部楼层
WSTON 发表于 2020-7-31 08:55
用的是RT1052的,显存在SDRAM,截图大部分可以,就是右侧有横向的雪花

大概率是Cache问题,关闭SDRAM的Cache测试
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
发表于 2020-7-31 10:19:41 | 显示全部楼层
eric2013 发表于 2020-7-31 09:32
大概率是Cache问题,关闭SDRAM的Cache测试

初始化的时候把显存部分内存设置成了 Non-cacheable:



/*************************************************************************************/
//这里使用MPU配置了4M的Non-cacheable空间供显存使用
MPU->RBAR = ARM_MPU_RBAR(8, 0x81C00000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_4MB);
/*************************************************************************************/
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-7-31 10:47:42 | 显示全部楼层
WSTON 发表于 2020-7-31 10:19
初始化的时候把显存部分内存设置成了 Non-cacheable:

你这个是显存空间,你存储界面数据的SDRAM空间也在这个里面么,这部分也设置了。

如果还是不行的话,你再找找别的原因。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 01:18 , Processed in 0.290465 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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