本帖最后由 hpdell 于 2018-5-27 07:09 编辑 请教下,硬件解码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; // 成功 } |
https://www.stmcu.org.cn/module/ ... amp;fromuid=2091055
评分
查看全部评分
你好,那个看了,貌似使用的不是 硬件解码jpg+emwin相结合的