请教下,使用 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); //中间位置显示
}
0