|
请教下,硬件解码jpg+emwin 显示失败 ?
相关代码如下:
static uint8_t *_acJpegBufferPtr = NULL;
static uint8_t * _rx_JpegBuff = NULL;
void my_picjpeg(FIL *file,uint8_t *DestAddress)
{
JPEG_Decode_init(); //申请内存
JPEG_Deinit();
JPEG_init();
JPEG_Decode_DMA(&JPEG_Handle,file, DestAddress);
do
{
SCB_CleanInvalidateDCache();
JPEG_InputHandler(&JPEG_Handle);
JpegProcessing_End = JPEG_OutputHandler(&JPEG_Handle);
}while(JpegProcessing_End == 0);
HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
JPEG_Decode_end(); //释放内存
}
uint8_t GUI_JPEG_DrawMemShowScaled(const char *FileName, U16 _usX, U16 _usY,int member,int denom, _JPEG_DispPosTpyeDef mode)
{
FRESULT result;
FIL JPEG_File;
float Xflag,Yflag;
int XSize, YSize;
result = f_open(&JPEG_File, FileName, FA_READ ); // 打开文件
if (result != FR_OK)
{
return 1;
}
// 申请一块内存空间
_acJpegBufferPtr = GUI_MYmalloc(/*JPEG_File.obj.objsize*/ 1024*600*4);
if(_acJpegBufferPtr == NULL)
{
f_close(&JPEG_File);
return 2;
}
_rx_JpegBuff = _acJpegBufferPtr;
my_picjpeg(&JPEG_File, (uint8_t *)_rx_JpegBuff); // 开始解码
/* 获取JPEG图片信息 */
XSize = JPEG_Info.ImageWidth; //获取JPEG图片的X轴大小, 数据正确
YSize = JPEG_Info.ImageHeight; //获取JPEG图片的Y轴大小, 数据正确
// 创建内存设备,并将BMP图片绘制到此内存设备里面,此内存设备要在主程序中用到
// 所以退出此函数前,不要释放。
hMemJPEG = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
GUI_MEMDEV_Select(hMemJPEG);
// _rx_JpegBuff = _acJpegBufferPtr;
// GUI_DrawBitmap(_rx_JpegBuff, 0, 0);
// GUI_MEMDEV_Select(0);
// GUI_MEMDEV_CopyToLCD(hMemJPEG);
// GUI_MEMDEV_WriteAt(hMemJPEG, 0, 0); //在需要的地方可以直接调用此函数,但是删除
/* 获取JPEG图片信息 */
XSize = JPEG_Info.ImageWidth; //获取JPEG图片的X轴大小
YSize = JPEG_Info.ImageHeight; //获取JPEG图片的Y轴大小
switch(mode)
{
case JPEG_DISP_MODE_SPE_POS: // 指定位置显示
_rx_JpegBuff = _acJpegBufferPtr;
if((member == 1) && (denom == 1)) //无需缩放,直接绘制
{
GUI_JPEG_Draw(_rx_JpegBuff,JPEG_File.obj.objsize,_usX,_usY); //在指定位置显示BMP图片
}
else //否则图片需要缩放
{
GUI_JPEG_DrawScaled(_rx_JpegBuff,JPEG_File.obj.objsize,_usX,_usY,member,denom);
}
break;
case JPEG_DISP_MODE_CEN_POS: // 在LCD屏中间显示
if(JPEG_Info.ImageWidth <= 1024)
XSize = (1024 - JPEG_Info.ImageWidth) / 2 -1; // 计算屏幕中间位置
else
XSize = 0; //大于从起点显示
if(JPEG_Info.ImageHeight <= 600)
YSize = (600 - JPEG_Info.ImageHeight) / 2 -1; // 计算屏幕中间位置
else
YSize = 0;
_rx_JpegBuff = _acJpegBufferPtr;
if((member == 1) && (denom == 1)) //无需缩放,直接绘制
{
//在LCD中间显示图片
GUI_JPEG_Draw(_rx_JpegBuff,JPEG_File.obj.objsize,XSize,YSize);
}
else //否则图片需要缩放
{
XSize = JPEG_Info.ImageWidth; //获取JPEG图片的X轴大小
YSize = JPEG_Info.ImageHeight; //获取JPEG图片的Y轴大小
Xflag = (float)XSize*((float)member/(float)denom);
Yflag = (float)YSize*((float)member/(float)denom);
if(Xflag >= 1024) // 缩放显示超过了屏幕范围
XSize = 0;
else
XSize = (1024-(int)Xflag)/2 - 1;
if(Yflag >= 600)
YSize = 0;
else
YSize = (600-(int)Yflag)/2 - 1;
GUI_JPEG_DrawScaled(_rx_JpegBuff,JPEG_File.obj.objsize,XSize,YSize,member,denom);
}
break;
}
f_close(&JPEG_File); //关闭JPEGFile文件
GUI_MEMDEV_Select(0); //句柄为 0 则激活 LCD
GUI_MEMDEV_WriteAt(hMemJPEG, 0, 0); //在需要的地方可以直接调用此函数,显示没有反应 ????????
GUI_MEMDEV_Delete(hMemJPEG); //删除 bmp 图片内存
// 释放动态内存hMem
GUI_MYfree((void *)_acJpegBufferPtr);
return 0; // 成功
} |
|