搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2018-5-27 07:13:25 | 显示全部楼层 |阅读模式
请教下,硬件解码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;  // 成功
}

出0入0汤圆

 楼主| 发表于 2018-6-18 15:44:43 | 显示全部楼层
都没有人使用 stm32fxx 的硬件解码 + emwin 相结合的使用啊 ???????

出0入34汤圆

发表于 2018-6-18 17:03:23 | 显示全部楼层
用 emWin 解 jpg 文件并显示,这个超吃内存的,约 6 ~ 7 年前玩过!按 emWin 手册范例在 LPC 上使过。详见 emWin 的使用手册 JPG 那章节有详述!

出0入0汤圆

 楼主| 发表于 2018-6-19 12:25:34 | 显示全部楼层
xyz543 发表于 2018-6-18 17:03
用 emWin 解 jpg 文件并显示,这个超吃内存的,约 6 ~ 7 年前玩过!按 emWin 手册范例在 LPC 上使过。详见  ...

你好,如果使用 emwin 提供的函数解码 jpg 文件是没有问题的,我

现在就是想使用 stm32f7xx 单片机硬件解码 jpg 图片功能,然后使用 emwin 进行显示,目前 单片机硬件解码jpg 是没有问题的,现在就是不知道该

如果调用 emwin 提供的相关函数来进行显示啊 ?!

出0入34汤圆

发表于 2018-6-20 22:07:08 | 显示全部楼层
hpdell 发表于 2018-6-19 12:25
你好,如果使用 emwin 提供的函数解码 jpg 文件是没有问题的,我

现在就是想使用 stm32f7xx 单片机硬件 ...

不就是将解完的类似 BMP 的彩色阵列数据丢到要显示的函数上,输入 X 及 Y 座标后自动完成丢往显示器上的记忆体或控制器让其显示?!
要不再简单一点,您是如何的输入 X 及 Y 的在显示器上显示的那函数,记得貌似 PUTPOINT 啥的,输入起始的 X 及 Y 座标后自动的 X++ 及 Y++ 去显示?!
别告诉我您连在显示器上打上一点这事也搞不成,那就真的有搞头了! 若真如此您就去拜那位 Eric2013 大神、正点原子 大神 或 秉火 这几位大神吧!恕我无力啊!

出0入0汤圆

 楼主| 发表于 2018-6-22 20:41:48 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-22 20:46 编辑
xyz543 发表于 2018-6-20 22:07
不就是将解完的类似 BMP 的彩色阵列数据丢到要显示的函数上,输入 X 及 Y 座标后自动完成丢往显示器上的 ...


哈哈哈,话虽如此,他们的使用的都是 emwin 自带的 软件解码程序,不是 stm32f7 硬件 + emwin 的相结合的,你的明白 ?????????

我现在就是还没有找到 相关的显示函数,你知道否 ????????????????????????????????????????????????????????????????????????????????????????????

出0入0汤圆

 楼主| 发表于 2018-6-23 17:45:56 | 显示全部楼层
xyz543 发表于 2018-6-20 22:07
不就是将解完的类似 BMP 的彩色阵列数据丢到要显示的函数上,输入 X 及 Y 座标后自动完成丢往显示器上的 ...

刚刚看到新的资料显示,emwin v5.44 版本开始才支持 stm单片机的硬件解码 jpg了,以下版本不支持的

出0入34汤圆

发表于 2018-6-23 23:14:44 | 显示全部楼层
hpdell 发表于 2018-6-22 20:41
哈哈哈,话虽如此,他们的使用的都是 emwin 自带的 软件解码程序,不是 stm32f7 硬件 + emwin 的相结合的 ...

哇喔!好多的问号喔,看来还是您厉害,着实让我佩服了哈~

出0入0汤圆

 楼主| 发表于 2018-6-24 20:12:27 | 显示全部楼层
xyz543 发表于 2018-6-23 23:14
哇喔!好多的问号喔,看来还是您厉害,着实让我佩服了哈~

哎,惭愧惭愧呀,

最近这几天才发现,原来 emwin v5.44 版本以下的都不支持 stm32fxx 的硬件解码 jpg +emwin 相结合显示,emwin 他们没有提供相关的显示接口函数

emwin v5.44 版本开始就开始支持了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 13:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表