STM32
直播中

李杰

8年用户 1464经验值
私信 关注
[问答]

使用emwin解码bmp图片,为什么放大显示不行?

请教下,使用 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)

赖文文

2024-4-29 10:39:19
文件路径是否一直一致,参考下【emWin - BMP图片显示】资料,不是所有的图片都合适压缩的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分