32. JPEG图片显示

JPEG(发音为“jay-peg”)是一种标准的全色和灰度图像压缩方法, 同时也是Joint Photographic Experts Group(联合图像专家组)的缩写。JPEG通常用于压缩“真实世界”场景, 线条画、卡通和其他非写实图像的压缩不是它的强项。JPEG是有损压缩,这意味着压缩前后的图像并不完全相同。 因此,如果必须有相同的输出位,则不能使用JPEG。然而,在摄影图像上,在没有明显变化的情况下, 可以获得非常好的压缩水平,如果能够接受质量较低的图像,则可以获得非常高的压缩水平。

emWin内置了JPEG库,可实现JPEG基线、扩展顺序和渐进压缩过程,不过目前还没有实现一些不常见的参数设置。 由于法律原因,不得分发JPEG算术编码变体代码。JPEG规范的算术编码选项似乎包含在IBM、AT&T和三菱拥有的专利中。 因此,在未经许可授权的情况下使用算术编码是不合法的。出于这个原因,emWin的JPEG库仅支持解码,不支持编码。

emWin的JPEG库在解码图像时会固定占用33KB的RAM空间,这部分与图像大小无关,而总的RAM占用可通过下面的公式得到:

总RAM占用 = 图像X方向大小 * 80字节 + 33KB

其中图像的X方向大小取决于JPEG图片所使用的压缩类型,具体见表格 JPEG解压的内存使用情况 。
在这里插入图片描述
emWin解压缩JPEG所占用的内存由emWin自身的内存管理系统动态分配。在绘制完成JPEG图像后, RAM会被完整的释放。

提供两种图片显示方式:一种是从外部存储器中读取数据并显示,一边读一边显示,占用RAM空间小,但显示速度很慢; 另一种是从外部存储器把图片数据全部读取出来再显示,显示速度较快,但占用大量RAM空间。

32.1. JPEG显示相关API
在这里插入图片描述
32.1.1. GUI_JPEG_Draw()
在当前窗口中的指定位置绘制一个已加载到内存中的jpeg文件。

代码清单:JPEG-1 函数原型

int GUI_JPEG_Draw(const void *pFileData, int DataSize, int x0, int y0);
  1. pFileData: 指向jpeg文件所在的存储区域的开头的指针;

  2. DataSize: jpeg文件的字节数;

  3. x0: JPEG左上角在屏幕上的x位置;

  4. y0: JPEG左上角在屏幕上的y位置。

返回值:绘制成功返回0,绘制失败返回非0。不过当前的实现是任何情况都返回0。

32.1.2. GUI_JPEG_DrawEx()
在当前窗口的指定位置绘制一个jpeg文件,该文件不必加载到内存中。

代码清单:JPEG-2 函数原型

int GUI_JPEG_DrawEx(GUI_GET_DATA_FUNC *pfGetData, void *p, int x0, int y0);

  1. pfGetData: 指向为获取数据而调用的函数的指针;

  2. p: 传递给pfGetData指向的函数的空指针;

  3. x0: JPEG左上角在屏幕上的x位置;

  4. y0: JPEG左上角在屏幕上的y位置。

返回值:绘制成功返回0,绘制失败返回非0。不过当前的实现是任何情况都返回0。

32.2. JPEG图片显示实验
接下来我们通过一个实验来讲解如何简单的显示一张JPEG图片, 更多API函数的演示实验可参考官方例程2DGL_DrawJPEG.c和2DGL_DrawJPEGScaled.c,例程路径如下:

SeggerEval_WIN32_MSVC_MinGW_GUI_V548\Sample\Tutorial\

本实验我们将使用emWin的基本JPEG显示API函数显示一张800*480分辨率、24位色彩深度的JPEG图片。

32.2.1. 代码分析
32.2.1.1. 绘制外部存储器(SD卡)中的JPEG
代码清单:JPEG-3 ShowJPEGEx函数(MainTask.c文件)

/**
* @brief 直接从存储器中绘制JPEG图片数据
* @note 无
* @param sFilename:需要加载的图片名
* @retval 无
*/
static void ShowJPEGEx(const char *sFilename)
{
   
    /* 进入临界段 */
    taskENTER_CRITICAL();
    /* 打开图片 */
    result = f_open(&file, sFilename, FA_READ);
    if ((result != FR_OK)) {
   
        printf("文件打开失败!\r\n");
        _acBuffer[0]='\0';
    }
    /* 退出临界段 */
    taskEXIT_CRITICAL();

    GUI_JPEG_DrawEx(_GetData, &file, 0, 0);

    /* 读取完毕关闭文件 */
    f_close(&file);
}

如 代码清单:JPEG-3 所示,从外部存储器种直接绘制JPEG图片的操作与绘制BMP图片的操作几乎是相同的, 都是必须通过文件系统函数f_open函数打开图片文件,图片打开成功后调用GUI_JPEG_DrawEx函数绘制, 这个函数和直接绘制BMP一样&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值