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

请教下,使用 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版