硬汉嵌入式论坛

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

[有问必答] RA8875驱动的7寸液晶,感觉有点问题要问

[复制链接]

2

主题

13

回帖

36

积分

新手上路

积分
36
发表于 2017-8-22 14:27:36 | 显示全部楼层 |阅读模式
公司项目,在你们淘宝上买了几块RA8875驱动的7寸液晶800*480.使用的mcu是stm407。现在有个功能是把屏幕截屏截下来保存到sd卡上,bmp格式。
为什么我截下来的图片,部分图形,直线变曲线了??如下图
QQ图片20170822142341.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-8-22 14:32:13 | 显示全部楼层
你的函数有问题,这个是我的emWin的截图效果,也是RA8875,函数用的emWin的API、

25_58_0d54118359f9b6c.gif
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 14:42:30 | 显示全部楼层
问题在哪里呢?
1..bmp格式
2.读像素函数问题?
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 14:43:08 | 显示全部楼层
static void MakeBmp565Header(__packed BMP_T *_pBmp, uint16_t _Width, uint16_t _Height)
{
    /* 14字节 位图文件头 */
    _pBmp->bfType = 0x4D42;    /* 2字节 位图类别, 在Windows中,此字段的值总为'BM'*/
    _pBmp->bfSize =(_Height * _Width * 2) + 54;    /* bmp文件大小 4字节 */
    _pBmp->bfReserved1 = 0;    /* 保留,每字节以"00"填写 2字节 */
    _pBmp->bfReserved2 = 0; /* 同上 2字节 */
    _pBmp->bfOffBits = 54;    /* 记录图像数据区的起始位置(图象数据相对于文件头字节的偏移量)。 4字节 */

    /* 40字节 位图信息头 */
    _pBmp->biSize = 40;        /* 4字节 本结构的大小,在Windows中,总为28h,40字节 */
    _pBmp->biWidth = _Width;/* 4字节 BMP图像的宽度,单位像素 */
    _pBmp->biHeight = _Height;        /* 4字节 BMP图像的高度,单位像素 */
    _pBmp->biPlanes = 1;            /* 2字节 目标设备的级别(色彩平面数),固定为1 */
    _pBmp->biBitCount = 16;            /* 2字节 BMP图像的色深,即一个像素用多少位表示。常见的有 1 4 8 16 24 32 */
    _pBmp->biCompression = 0;        /* 4字节 压缩类型,0(不压缩), 1(BI_RLE8), 2(BI_RLE4) */
    _pBmp->biSizeImage =(_Height * _Width * 2);    /* 4字节 表示位图数据区域的大小以字节为单位 */
    _pBmp->biXPelsPerMeter = 0;    /* 4字节 用象素/米表示的水平分辨率 2835*/
    _pBmp->biYPelsPerMeter = 0;    /* 4字节 用象素/米表示的垂直分辨率 2835*/
    _pBmp->biClrUsed = 0;        /* 4字节 实际使用色彩数目,0则由位数定 */
    _pBmp->biClrImportant = 0;    /* 4字节 图像中重要的色彩数目。0表示调色板内所有的颜色都是重要的  */
}
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 14:43:56 | 显示全部楼层
void SaveScreenToBmp()
{
    __packed BMP_T tBmpHead;
    uint16_t LineData[800];     /* 按最大 800像素宽度分配缓冲区 */
    uint16_t i,j;
    uint16_t pixel;
//    static uint16_t _index = 0;
//    _index++;

    /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
    FRESULT result;
    FATFS fs;
    FIL file;
    uint32_t bw;
    char path[32];



    MakeBmp565Header(&tBmpHead, LCD_GetWidth(), LCD_GetHeight());    /* 构建BMP文件头 */

    /* 文件系统操作 */
    {
        /* 挂载文件系统 */
        result = f_mount(&fs, FS_VOLUME_SD, 0);            /* Mount a logical drive, 1表示立即执行 */
        if (result != FR_OK)
        {
            goto quit1;
        }

        /* 打开文件 */
        sprintf(path, "%s/%0.2x%0.2x%0.2x%0.2x%0.2x%0.2x.bmp", FS_VOLUME_SD, ChildForm->RTC_TimeDataStructure.Year,  ChildForm->RTC_TimeDataStructure.Month,ChildForm->RTC_TimeDataStructure.Day,
         ChildForm->RTC_TimeDataStructure.Hour,ChildForm->RTC_TimeDataStructure.Minute, ChildForm->RTC_TimeDataStructure.Second);
        //result = f_opendir(&DirInf, path);
        result = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE);
        if (result != FR_OK)
        {
            //printf("创建SD卡文件%s失败 (%d)\\r\\n", path, result);
            goto quit1;
        }
    }

    /* 写bmp文件头 */
    result = f_write(&file, (char *)&tBmpHead, 54, &bw);
    if (result != FR_OK)
    {
        //printf("%s 文件写入失败\\r\\n", path);
        goto quit1;
    }

    /* 开始读取屏幕数据,并写入文件 */
    for (i = 0; i <tBmpHead.biHeight; i++)
    {
        fnWDT_Restart();
        powerdown_process();
        // 读取1行数据到缓冲区 (注意:BMP文件扫描次序,从左到右,从下到上。和LCD逻辑坐标是垂直翻转的) //
        for (j = 0; j <tBmpHead.biWidth; j++)
        {
            pixel = LCD_GetPixel(j, tBmpHead.biHeight - i - 1);        // 读取屏幕1个像素 (RGB = 565结构)//

            LineData[j] = pixel;   
        }


    // 写1行数据
        result = f_write(&file, LineData, tBmpHead.biWidth * 2, &bw);
        if (result != FR_OK)
        {
            //printf("%s 文件写入失败\\r\\n", path);
            goto quit1;
        }
               
    }
quit1:
    /* 关闭文件*/
    f_close(&file);

    /* 卸载文件系统 */
    //f_mount(ucVolume, NULL);
    f_mount(NULL,FS_VOLUME_SD, 0);


        
}
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 14:46:55 | 显示全部楼层
主要是这部分,没看出哪里有问题啊?除非LCD_GetPixel这函数本身有问题
/* 开始读取屏幕数据,并写入文件 */
    for (i = 0; i <tBmpHead.biHeight; i++)
    {
        fnWDT_Restart();
        powerdown_process();
        // 读取1行数据到缓冲区 (注意:BMP文件扫描次序,从左到右,从下到上。和LCD逻辑坐标是垂直翻转的) //
        for (j = 0; j <tBmpHead.biWidth; j++)
        {
            pixel = LCD_GetPixel(j, tBmpHead.biHeight - i - 1);        // 读取屏幕1个像素 (RGB = 565结构)//

            LineData[j] = pixel;   
        }


    // 写1行数据
        result = f_write(&file, LineData, tBmpHead.biWidth * 2, &bw);
        if (result != FR_OK)
        {
            //printf("%s 文件写入失败\\r\\n", path);
            goto quit1;
        }
               
    }
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 14:56:24 | 显示全部楼层
大神帮我看看,我搁这好几天了,实在没办法才上来请教
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-8-22 15:02:03 | 显示全部楼层

回 hpei2003 的帖子

hpei2003:问题在哪里呢?
1..bmp格式
2.读像素函数问题?
(2017-08-22 14:42)
都有可能,什么读像素,SD卡写入等等,都有可能有问题。这个是我早期做的裸机的BMP截图,可以参考,现在很少用裸机了,都是emWin全套实现。

文件头:
  1. /*************************BMP信息头 40字节***************************/
  2. typedef  __packed struct
  3. {
  4.     DWORD biSize ;           //说明BITMAPINFOHEADER结构所需要的字数。
  5.     LONG  biWidth ;           //说明图象的宽度,以象素为单位
  6.     LONG  biHeight ;       //说明图象的高度,以象素为单位
  7.     WORD  biPlanes ;       //为目标设备说明位面数,其值将总是被设为1
  8.     WORD  biBitCount ;       //说明比特数/象素,其值为1、4、8、16、24、或32
  9.     DWORD biCompression ;  //说明图象数据压缩的类型。其值可以是下述值之一:
  10.                            //BI_RGB:没有压缩;
  11.                            //BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);  
  12.                            //BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
  13.                              //BI_BITFIELDS:每个象素的比特由指定的掩码决定。
  14.     DWORD biSizeImage ;       //说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0  
  15.     LONG  biXPelsPerMeter ;//说明水平分辨率,用象素/米表示
  16.     LONG  biYPelsPerMeter ;//说明垂直分辨率,用象素/米表示
  17.     DWORD biClrUsed ;       //说明位图实际使用的彩色表中的颜色索引数
  18.     DWORD biClrImportant ; //说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
  19. }BITMAPINFOHEADER ;
  20. /*************************BMP头文件 14字节***************************/
  21. typedef  __packed struct
  22. {
  23.     WORD  bfType ;        //文件标志.只对'BM',用来识别BMP位图类型
  24.     DWORD bfSize ;          //文件大小,占四个字节
  25.     WORD  bfReserved1 ;   //保留
  26.     WORD  bfReserved2 ;   //保留
  27.     DWORD bfOffBits ;     //从文件开始到位图数据(bitmap data)开始之间的的偏移量
  28. }BITMAPFILEHEADER ;
  29. /*************************位图信息头 54字节*************************/
  30. typedef  __packed struct
  31. {
  32.     BITMAPFILEHEADER bmfHeader;
  33.     BITMAPINFOHEADER bmiHeader;   
  34. }BITMAPINFO;
复制代码
函数:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: GUI_Copy_ScreenRect()
  4. *    功能说明: 屏幕截图,然后以bmp图片格式(为24位高真彩位图)保存到指定的路径下
  5. *    形    参:x:X坐标   y:y坐标   sizex:长度   sizey:宽度
  6. *             *Save_Path:保存路径,其中文件名后缀必须为bmp
  7. *             例如:"0:/Picture/abcd.bmp" 注意!!:路径"0:/0:/Picture"必须存在
  8. *             否则该函数调用无效。               
  9. *    返 回 值: 无
  10. *********************************************************************************************************
  11. */
  12. void GUI_SaveBMP(uint16_t startx,uint16_t starty,uint16_t sizex,uint16_t sizey,void *Save_Path)
  13. {
  14.     uint32_t    size = (sizex*sizey)*3;//-- 由于是24为BMP位图,一个像素占3个字节,所以要乘以3
  15.     uint16_t    Header_num = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  16.     int16_t     i = 0,j = 0,temp = 0,count = 0;
  17.     uint16_t     Buffer_num = 510;
  18.     BITMAPFILEHEADER      BmpFileHeader;
  19.     BITMAPINFOHEADER     BmpInfoHeader;
  20.    
  21.     /*------------------------------- 建立文件头数据 -----------------------------------------*/
  22.     BmpFileHeader.bfType      = 0x4D42;//--文件标志.只对'BM',用来识别BMP位图类型
  23.     BmpFileHeader.bfSize       = size + Header_num;//--文件大小,占四个字节
  24.     BmpFileHeader.bfReserved1 = 0;                  //--保留字段1
  25.     BmpFileHeader.bfReserved2 = 0;                  //--保留字段2
  26.     BmpFileHeader.bfOffBits   = Header_num;//--从文件开始到位图数据(bitmap data)开始之间的的偏移量
  27.     /*------------------------------- 建立文件信息数据 ---------------------------------------*/
  28.     BmpInfoHeader.biSize   = sizeof(BITMAPINFOHEADER);//--说明BITMAPINFOHEADER结构所需要的字数
  29.     BmpInfoHeader.biWidth  = sizex;   //--说明图象的宽度,以象素为单位
  30.     BmpInfoHeader.biHeight = sizey;   //--说明图象的高度,以象素为单位
  31.     BmpInfoHeader.biPlanes = 1;          //--为目标设备说明位面数,其值将总是被设为1
  32.     BmpInfoHeader.biBitCount = 24;    //--说明比特数/象素,其值为1、4、8、16、24、或32
  33.     BmpInfoHeader.biCompression = 0;  //--说明图象数据压缩的类型,无压缩
  34.     BmpInfoHeader.biSizeImage = size; //--说明图象的大小(必须是4的倍数),以字节为单位。
  35.                                         //--当用BI_RGB格式时,可设置为0
  36.     BmpInfoHeader.biXPelsPerMeter = 0;//--说明水平分辨率,用象素/米表示
  37.     BmpInfoHeader.biYPelsPerMeter = 0;//--说明垂直分辨率,用象素/米表示
  38.     BmpInfoHeader.biClrUsed          = 0;//--说明位图实际使用的彩色表中的颜色索引数
  39.     BmpInfoHeader.biClrImportant  = 0;//--说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要
  40.     /*-------------------------- 创建保存截图数据的文件  ------------------------------------*/
  41.     if (f_open(&FileSave,Save_Path, FA_WRITE|FA_CREATE_ALWAYS) == FR_OK )
  42.     {   
  43.             //--先写图像头数据和图像信息数据
  44.             result = f_write (&FileSave,&BmpFileHeader,sizeof(BmpFileHeader),&bw);
  45.             if (result != FR_OK)
  46.             {
  47.                 return;
  48.             }
  49.             
  50.             result = f_write (&FileSave,&BmpInfoHeader,sizeof(BmpInfoHeader),&bw);
  51.             if (result != FR_OK)
  52.             {
  53.                 return;
  54.             }
  55.             for(j = sizey-1; j >= 0; j--)
  56.             {            
  57.                      for(i = 0; i < sizex; i++)
  58.                      {
  59.                             temp = LCD_GetPixel(startx+i,starty+j);
  60.                             data[count+2] = (u8)((temp&0xf800)>>8);
  61.                             data[count+1] = (u8)((temp&0x7e0)>>3);
  62.                             data[count]   = (u8)((temp&0x1f)<<3);
  63.                             count += 3;
  64.                             if(count == Buffer_num)
  65.                             {
  66.                                     count = 0;
  67.                                     result = f_write (&FileSave,data,Buffer_num,&bw);
  68.                                     if (result != FR_OK)
  69.                                     {
  70.                                         return;
  71.                                     }        
  72.                             }
  73.                      }
  74.             }
  75.         if(count > 0)    f_write (&FileSave,data,count,&bw);
  76.         f_close(&FileSave);            
  77.      }
  78. }
复制代码
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 15:12:19 | 显示全部楼层
ra8875读出来的颜色是rgb565,转换成rgb888,貌似颜色会失真,刚开始也是按你这样做的,后来发现颜色失真,所以我用现在的方法,bmp用16位的颜色。现在颜色倒是不失真了
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 15:15:26 | 显示全部楼层
先谢谢了,我用你的函数再试试
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-8-22 15:16:57 | 显示全部楼层
没问题的,最早2013年的时候,我做的综合例子就是这种截图,因为emWin还没有截图功能,只能这种裸机方式截图了,效果杠杠的,看下面这个截图效果:
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=1139

ps:就帮你这么多吧,剩下自己搞搞吧。
==================================
12_58_1f3a41b639bcba7.jpg


12_58_53d8d363cda786f.jpg
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 16:28:57 | 显示全部楼层
还是老问题,用你函数后,颜色就失真了。。。[s:128]
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-22 16:30:34 | 显示全部楼层
大神,fsmc和sd卡配置,有没哪方面要注意的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-8-23 01:21:16 | 显示全部楼层

回 hpei2003 的帖子

hpei2003:大神,fsmc和sd卡配置,有没哪方面要注意的 (2017-08-22 16:30) 
换个卡试试,另外就是,把你的SD卡格式化一次再使用。
回复

使用道具 举报

2

主题

13

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2017-8-23 09:44:15 | 显示全部楼层
没辙了,怎么试都不行[s:139]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-17 06:51 , Processed in 0.050359 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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