
请教下,使用 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:1 也正常的,
目前就唯独 放大不行