hpdell 发表于 2018-5-27 07:06:28

请教下,硬件解码jpg+emwin 显示失败 ?

本帖最后由 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;
      FILJPEG_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;// 成功
}
















feixiang20 发表于 2018-5-28 03:23:43

要不要去参考下【EMWIN实验36 JPEG图片显示】资料
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=615167&fromuid=2091055

hpdell 发表于 2018-6-1 09:27:04

feixiang20 发表于 2018-5-28 03:23
要不要去参考下【EMWIN实验36 JPEG图片显示】资料
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewt ...

你好,那个看了,貌似使用的不是 硬件解码jpg+emwin相结合的
页: [1]
查看完整版本: 请教下,硬件解码jpg+emwin 显示失败 ?