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

请教下,硬件解码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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版