你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
hpdell 提问时间:2018-5-27 07:06 /
本帖最后由 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;  // 成功
}
















收藏 1 评论2 发布时间:2018-5-27 07:06

举报

2个回答
feixiang20 回答时间:2018-5-28 03:23:43
要不要去参考下【EMWIN实验36 JPEG图片显示】资料
https://www.stmcu.org.cn/module/ ... amp;fromuid=2091055

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

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相结合的

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版