STM32
直播中

吴湛

10年用户 977经验值
擅长:417804
私信 关注
[问答]

硬件解码jpg+emwin显示失败的原因?

请教下,硬件解码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)

而无返还

2024-4-29 17:54:42
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库的初始化和配置、图像显示函数以及错误处理。同时,添加调试和日志记录有助于更快地定位问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分