你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教下,使用 emwin 解码 bmp 图片,图片 1:1 及缩小显示都没...

[复制链接]
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 评论2 发布时间:2018-5-24 22:33

举报

2个回答
feixiang20 回答时间:2018-5-24 23:04:04
文件路径是否一直一致,参考下【emWin - BMP图片显示】资料,不是所有的图片都合适压缩的

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2018-5-25 16:54:38
feixiang20 发表于 2018-5-24 23:04
文件路径是否一直一致,参考下【emWin - BMP图片显示】资料,不是所有的图片都合适压缩的 ...

那我更换图片试试看吧,我需要吧 图片放大啊,图片缩小貌似工作正常,显示1:1 也正常的,

目前就唯独 放大不行

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版