硬汉嵌入式论坛

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

[emWin] 请教下,使用 emwin 解码 bmp 图片,放大显示貌似不行 ?

[复制链接]

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
发表于 2018-5-24 22:26:54 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2018-5-24 22:33 编辑


请教下,使用 emwin 解码 bmp 图片,图片 1:1 及缩小显示都没有问题,唯独放大显示不行 ????????

使用emwin 版本如下:
emwin v5.40 keil argb -ot  

GUI_MEMDEV_Handle hMemBMP;

程序如下:
/*
函数名称:GUI_BMP_DrawMemShowScaled
函数功能:加载到SDRAM显示,带放大、缩小功能
参数:    FileName 显示的文件名称
          _usX     显示 x 坐标
          _usY     显示 y 坐标
          member   缩放分子, 分子、分母同时为1,表示不用缩放
                            denom    缩放分母  分子、分母同时为1,表示不用缩放
          mode     BMP_DISP_MODE_SPE_POS:指定位置显示 ,  由参数_usX,_usY确定显示位置  
                   BMP_DISP_MODE_CEN_POS: 居中显示,当选择此模式的时候参数_usX,_usY无效
返回值:  0表示成功,其他值错误
*/
uint8_t GUI_BMP_DrawMemShowScaled(const char *FileName, U16 _usX, U16 _usY,int member,int denom, _BMP_DispPosTpyeDef mode)
{
  FRESULT result;
        FIL  BMP_File;
  UINT    bw;
        float Xflag,Yflag;
        int XSize, YSize;

        result = f_open(&BMP_File, FileName,  FA_READ );  // 打开文件
        if (result != FR_OK)
        {
                return 1;
        }
         
        // 申请一块内存空间
        _acBufferPtr = GUI_MYmalloc(BMP_File.obj.objsize);
        if(_acBufferPtr == NULL)
        {
                f_close(&BMP_File);               
                return 2;
        }

  vTaskSuspendAll(); // 开启调度锁
        _rx_BmpBuff = _acBufferPtr;
        
        // 读取文件到动态内存
        result = f_read(&BMP_File, _rx_BmpBuff, BMP_File.obj.objsize, &bw);
        if (result != FR_OK)
        {
                // 关闭文件
                f_close(&BMP_File);               
                GUI_MYfree((void *)_acBufferPtr);
    xTaskResumeAll (); // 关闭调度锁
                return 3;
        }
        // 关闭文件
        f_close(&BMP_File);        
        
        xTaskResumeAll (); // 关闭调度锁
        
        XSize = 1024;
        YSize = 600;
        
        // 创建内存设备,并将BMP图片绘制到此内存设备里面,此内存设备要在主程序中用到
        //   所以退出此函数前,不要释放。
        hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
        GUI_MEMDEV_Select(hMemBMP);
        
        switch(mode)
        {
                // 指定位置显示
                case BMP_DISP_MODE_SPE_POS:
                        _rx_BmpBuff = _acBufferPtr;
                        if((member == 1) && (denom == 1)) //无需缩放,直接绘制
                        {
                                GUI_BMP_Draw(_rx_BmpBuff,_usX,_usY);        //在指定位置显示BMP图片
                        }
                        else //否则图片需要缩放
                        {
                                GUI_BMP_DrawScaled(_rx_BmpBuff,_usX,_usY,member,denom);
                        }                        
                break;
               
                // 在LCD屏中间显示
                case BMP_DISP_MODE_CEN_POS:
                        _rx_BmpBuff = _acBufferPtr;
                        XSize = GUI_BMP_GetXSize(_rx_BmpBuff);        //获取图片的X轴大小
                  _rx_BmpBuff = _acBufferPtr;
                        YSize = GUI_BMP_GetYSize(_rx_BmpBuff);        //获取图片的Y轴大小                        
                        if((member == 1) && (denom == 1)) //无需缩放,直接绘制
                        {
                                _rx_BmpBuff = _acBufferPtr;
                                //在LCD中间显示图片
                                GUI_BMP_Draw(_rx_BmpBuff,(1024-XSize)/2 - 1,(600-YSize)/2 - 1);
                        }
                        else //否则图片需要缩放
                        {
                                Xflag = (float)XSize*((float)member/(float)denom);
                                Yflag = (float)YSize*((float)member/(float)denom);
                                XSize = (1024-(int)Xflag)/2 - 1;
                                YSize = (600-(int)Yflag)/2 - 1;
                                _rx_BmpBuff = _acBufferPtr;
                                GUI_BMP_DrawScaled(_rx_BmpBuff,XSize,YSize,member,denom);
                        }                        
                break;
        }
        
        // 释放动态内存hMem
        GUI_MYfree((void *)_acBufferPtr);
        
        GUI_MEMDEV_Select(0);                 //选择
        GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);    //显示 bmp 图片
        GUI_MEMDEV_Delete(hMemBMP);           //删除 bmp 图片内存
        
        return 0;  // 成功
        
}






void bmp_disptest(void)
{
                //指定位置显示,无需缩放   ok
                GUI_BMP_DrawMemShowScaled("0:/Picture/bmp/1024x600-6.bmp",
                                                                                                                        0, 0,  // 显示的 x, y 坐标
                                                                                                                        1, 1,  // 无需缩放
                                                                                                                        BMP_DISP_MODE_SPE_POS);  //指定位置显示
                HAL_Delay(2000);                                                                                                        
                //指定位置显示,缩小 1/2 显示   ok
                GUI_SetColor(GUI_WHITE);
                GUI_Clear();
                GUI_BMP_DrawMemShowScaled("0:/Picture/bmp/1024x600-6.bmp",
                                                                                                                        100, 50,  // 显示的 x, y 坐标
                                                                                                                        1, 2,  // 缩小 1/2 显示
                                                                                                                        BMP_DISP_MODE_SPE_POS);  //指定位置显示


                HAL_Delay(2000);                                                                                                        
                //中间位置显示,缩小 1/2 显示  ok
                GUI_SetColor(GUI_WHITE);
                GUI_Clear();
                GUI_BMP_DrawMemShowScaled("0:/Picture/bmp/1024x600-6.bmp",
                                                                                                                        100, 50,  // 显示的 x, y 坐标
                                                                                                                        1, 2,  // 缩小 1/2 显示
                                                                                                                        BMP_DISP_MODE_CEN_POS);  //中间位置显示        

                HAL_Delay(2000);                                                                                                        
                //指定位置显示,1:1 显示  ok
                GUI_SetColor(GUI_WHITE);
                GUI_Clear();
                GUI_BMP_DrawMemShowScaled("0:/Picture/bmp/A4R4G4B4.bmp",
                                                                                                                        1024/2, 600/2,  // 显示的 x, y 坐标
                                                                                                                        1, 1,  // 1:1显示
                                                                                                                        BMP_DISP_MODE_SPE_POS);  //指定位置显示




                HAL_Delay(2000);                                                                                                        
                //指定位置显示,扩大 2 倍 显示   没有任何显示  ?????????????
                GUI_SetColor(GUI_WHITE);
                GUI_Clear();
                GUI_BMP_DrawMemShowScaled("0:/Picture/bmp/A4R4G4B4.bmp",
                                                                                                                        1024/2, 600/2,  // 显示的 x, y 坐标
                                                                                                                        2, 1,  // 扩大 2 倍 显示
                                                                                                                        BMP_DISP_MODE_SPE_POS);  //指定位置显示        


                HAL_Delay(2000);                                                                                                        
                //中间位置显示,扩大 2 倍 显示没有任何显示  ?????????????
                GUI_SetColor(GUI_WHITE);
                GUI_Clear();
                GUI_BMP_DrawMemShowScaled("0:/Picture/bmp/A4R4G4B4.bmp",
                                                                                                                        0, 0,  // 显示的 x, y 坐标
                                                                                                                        2, 1,  // 扩大 2 倍 显示
                                                                                                                        BMP_DISP_MODE_CEN_POS);  //中间位置显示        

}









回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-5-25 01:37:06 | 显示全部楼层
这个不用创建存储设备
hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
        GUI_MEMDEV_Select(hMemBMP);

GUI_MEMDEV_Select(0);

你直接绘制GUI_BMP_DrawScaled下看看。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-5-25 09:53:55 | 显示全部楼层
eric2013 发表于 2018-5-25 01:37
这个不用创建存储设备
hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
     ...

我试过了,还是不行啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-5-25 13:42:39 | 显示全部楼层
hpdell 发表于 2018-5-25 09:53
我试过了,还是不行啊

这样,你在模拟器上测试下你的BMP放大功能,图片以C文件数值记录,用B2C.exe小软件可以转换。
排查是不是你的模板有问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 15:01 , Processed in 0.274564 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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