完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下,硬件解码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; // 成功 } |
|
相关推荐
1个回答
|
|
1. 确保硬件解码器支持JPG格式:首先,请确保您的硬件解码器支持JPG格式的图像。如果不支持,您可能需要使用其他解码器或转换图像格式。
2. 检查内存分配:在您的代码中,您使用了两个指针变量(_acJpegBufferPtr 和 _rx_JpegBuff)。请确保在调用JPEG_Decode_init()和JPEG_Deinit()函数之前,这两个指针已经正确分配了内存。如果内存分配失败,解码过程可能会失败。 3. 检查文件读取:请确保您正确地读取了JPG文件。在调用my_picjpeg()函数时,确保file参数指向一个有效的JPG文件,并且DestAddress指向一个足够大的缓冲区以存储解码后的图像数据。 4. 检查emWin库的初始化和配置:确保您正确地初始化了emWin库,并正确配置了显示参数。这包括设置正确的屏幕分辨率、颜色深度等。 5. 检查图像显示函数:在解码JPG图像后,您需要使用emWin库的函数来显示图像。请确保您正确地使用了这些函数,例如使用GUI_SetBkColor()设置背景颜色,使用GUI_ClearRect()清除屏幕区域,以及使用GUI_DrawBitmap()或类似函数来绘制图像。 6. 检查错误处理:在您的代码中,您可能需要添加错误处理机制,以便在解码过程中出现问题时能够及时发现并处理。例如,您可以检查JPEG_Decode_init()和JPEG_Deinit()函数的返回值,以确定解码过程是否成功。 7. 调试和日志记录:为了更好地了解问题所在,您可以在关键步骤添加日志记录,以便在出现问题时能够追踪代码执行过程。 综上所述,要解决硬件解码JPG+emWin显示失败的问题,您需要检查硬件解码器的支持、内存分配、文件读取、emWin库的初始化和配置、图像显示函数以及错误处理。同时,添加调试和日志记录有助于更快地定位问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1090 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1107 浏览 1 评论
545 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
412 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
990 浏览 2 评论
1591浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
262浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
274浏览 3评论
245浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
238浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 07:08 , Processed in 0.667794 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号