TJpgDec—轻量级JPEG解码器

本文由乌合之众lym瞎编,欢迎转载blog.cnblogs.net/oloroso

下文中解码一词皆由decompression/decompress翻译而来。

TJpgDec是一个为小型嵌入式系统高度优化的创建JPEG图像的解码模块。它工作时占用的内存非常低,以便它可以集成到微控芯片,如AVR, 8051, PIC, Z80, Cortex-M0等。

特性

  • 平台独立。使用ANSI-C编写
  • 易于使用的主操作模式
  • 完全可重入的体系结构

    Very small memory footprint:

  • 非常小的内存占用

    独立于图像尺寸的3K工作内存。

    3.5-8.5KB的文本和常数ROM.

  • 输出格式:

    缩放比例:1/1、1/2、1/4或1/8可选。

    像素格式:RGB888或RGB565预配置。

API接口

有两个函数用于分析和解码JPEG图像。

jd_prepare

jd_prepare - 准备解码JPEG图像

jd_prepare分析JPEG数据并创建一个解码对象(decompression object)用于随后的解码过程。

JRESULT jd_prepare (
JDEC* jdec, /* Pointer to blank decompression object */
UINT(*infunc)(JDEC*,BYTE*,UINT), /* Pointer to input function */
void* work, /* Pointer to work area */
UINT sz_work, /* Size of the work area */
void* device /* Device identifier for the session */
);

参数

  • jdec

    指定解码对象去初始化。这个解码对象是用于后续的解码操作。

  • input

    指定用户定义的数据输入函数。jd_preparejd_decomp调用这个函数来从输入流读取JPEG数据.

  • work

    指向此会话工作区域的指针。它应该与word边界对齐或者它可以导致一个异常。

  • sz_work

    指定工作区域的字节数。TJpgDec至多需要3092字节的工作区域,这依赖于JPEG图像的内置参数表。通常情况下是3092字节工作区域.

  • device

    指定用户定义的会话设备标识。它保存在解码对象的device成员中。它可以用于I/O函数去识别当前会话。当I/O device固定在project或者不需要这个功能,设置为NULL并忽略它。

返回值

  • JDR_OK

    Function succeeded and decompression object is valid.

    函数执行成功,且编码对象是有效的。

  • JDR_INP

    An error occured in input function due to hard error or wrong stream termination.

    一个错误发生在input函数,由于硬件错误或者流终止。

  • JDR_MEM1

    Insufficient work area for this JPEG image.

    工作区域不足解码这个JPEG图像。

  • JDR_MEM2

    Insufficient input buffer for this JPEG image. JD_SZBUF may be too small.

    输入缓冲器不足读取这个JPEG图像,JD_SZBUF可能过小。

  • JDR_PAR

    Parameter error. Given pointer to the work area is NULL.

    参数错误。传入的工作区指针为NULL。

  • JDR_FMT1

    Data format error. The JPEG data can be collapted.

    数据格式错误。JPEG数据损坏。

  • JDR_FMT2

    Right format but not supported. May be a grayscale image.

    格式正确,但不支持。也许是一个灰度图像。

  • JDR_FMT3

    Not supported JPEG standard. May be a progressive JPEG image.

    不支持JPEG标准,也许是一个先进的JPEG图像。

描述

jd_prepare函数是JPEG解码会话的第一阶段。它分析JPEG图像和创建解码参数表。函数成功后,会话准备好在jd_decomp函数解码JPEG图像。应用程序可以参考JPEG解码对象中存储的尺寸大小。这个信息将用于在后续的解码阶段配置输出设备(device)和参数。

jd_decomp

jd_decomp - 执行解码JPEG图像

jd_decomp函数解码JPEG图像并输出RGB数据。

JRESULT jd_decomp (
JDEC* jdec, /* Pointer to valid decompressor object */
UINT(*outfunc)(JDEC*,void*,JRECT*), /* Pointer to output function */
BYTE scale /* Scaling factor */
);

参数

  • jdec

    指定有效的解码对象。

  • outfunc

    指定用户定义的输出函数。jd_decomp调用这个函数去输出解码JPEG图像的RGB形式。

  • scale

    指定输出比例因子N。输出图像的缩小比例为1/2^N(N = 0 to 3)。当缩放功能禁用时(JD_USE_SCALE == 0),它必须是0.

返回值

  • JDR_OK

    Function succeeded.

    函数执行成功。

  • JDR_INTR

    The decompression process is interrupted by output function.

    解码过程在输出函数中断。

  • JDR_INP

    An error occured in input function due to hard error or wrong stream termination.

    一个错误发生在input函数,由于硬件错误或者流终止。

  • JDR_PAR

    Parameter error. Given scale factor is invalid.

    参数错误。给定的缩放值无效。

  • JDR_FMT1

    Data format error. The JPEG data can be collapted.

    数据格式错误。JPEG数据损坏。

描述

jd_decomp是JPEG解码会话的第二阶段。它解码JPEG图像并通过用户定义的输出函数输出数据,在它之后,解码对象将不在有效。

在解码时指定的比例因子,它将JPEG图像按1/2、1/4或1/8比例缩放尺寸。例如,当解码一个1024x768大小JPEG图像在1/4比例,它将输出256x192大小。相比不缩放,1/2和1/4的缩放由于求均值,解码速度略有下降。但是1/8缩放相比不缩放是2-3倍的速度输出,因为每个块IDCT和求均值可以跳过。这一特点适合创建缩略图。

I/O函数

输入JPEG数据并输出解码后像素,TJpgDec需要用户定义两个I/O函数

Input Function

Input funciotn - 从输入流读取JPEG数据

用户定义的从输入流读取数据的输入函数。

UINT in_func (
JDEC* jdec, /* Pointer to the decompression object */
BYTE* buff, /* Pointer to buffer to store the read data */
UINT ndata /* Number of bytes to read */
);

参数

  • jdec

    指定解码会话的解码对象。

  • buff

    指定读缓冲器去保存读取数据。传入NULL将数据从输入流移除。

  • ndata

    指定从输入流读取或移除的字节数。

返回值

返回读取或移除的字节数。若返回0,jd_preparejd_decomp函数将终止并返回JDR_INP

描述

这个函数是TJpgDec模块的数据输入接口。可以通过指向设备标识符的指针来标识相应的解码会话。

Output Function

Output function - 写像素数据到输出设备

用户定义的输出函数,写解码像素到输出设备。

UINT out_func (
JDEC* jdec, /* Pointer to the decompression object */
void* bitmap, /* RGB bitmap to be output */
JRECT* rect /* Rectangular region to output */
);

参数

  • jdec

    指定会话的解码对象。

  • bitmap

    指定RGB位图(bitmap)用于输出。

  • rect

    指定在图像中的矩形区域去输出RGB位图。

返回值

通常返回1,以便TJpgDec继续解码过程。当它返回0,jd_decomp函数终止并返回JDR_INTR,这在中断减压过程中有用。

描述

这个函数是TJpgDec模块的数据输出函数。可以通过指向设备标识符的指针来标识相应的解码会话,jdec->device通过jd_prepare函数第五个参数确定。

在这个函数中,位图发送到帧缓冲或显示设备。第一个像素是位图矩形的左上角位置,最后一个像素是右下角位置。矩形的大小从1x116x16取决于图像的裁剪、缩放和采样因子。如果矩形是帧缓冲区,它将在函数中倍裁剪。

像素格式取决于JD_FORMAT参数的配置选项。当它配置为RGB888,位图是一个字节数组,每3个字节保存一个RGB像素:RRRRRRRR, GGGGGGGG, BBBBBBBB, RRRRRRRR, GGGGGGGG, BBBBBBBB, ...;配置为RGB565时,位图是一个WORD数组,RGB数据1word每像素:RRRRRGGGGGGBBBBB, RRRRRGGGGGGBBBBB, RRRRRGGGGGGBBBBB, ...

资源

TJpgDec是一个免费软件,对教育、研究和开发开发。你可以使用、修改和重新分发它,对个人项目或商业产品没有任何限制和责任。

TJpgDec—轻量级JPEG解码器的更多相关文章

  1. 在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据

    在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据 如今,最流行的拍照设备智能手机可以捕获高达4K UHD的图像(3840×2160图像),原始数据超过25 MB.即使 ...

  2. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库

    在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库 根据调查,普通人产生的1.2万亿张图像可以通过电话或数码相机捕获.这样的图像的存储,尤其是以高分辨率的原始格式, ...

  3. NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库

    NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Lib ...

  4. TJpgDec使用说明

    TJpgDec模块应用说明 [TOC] 怎么使用 首先,你应该构建和运行如下所示示例程序.这是一个典型的使用TJpgDec模块,它有助于调试和缩小问题. 解码会话分为两个阶段.第一阶段是分析JPEG图 ...

  5. DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...

  6. jpeg软解码实现介绍

    我的月经贴博客该更新了!!!已经有许多博文需要补了! 去年开始的jpeg解码项目,中间停止更新了大半年时间,上个月想起这事还没完工,就又做了更多兼容性和性能上的改进,目前终于接近尾声了.有需要参考的可 ...

  7. 《HelloGitHub》第 57 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  8. CUDA 11功能清单

    CUDA 11功能清单 基于NVIDIA Ampere GPU架构的新型NVIDIA A100 GPU在加速计算方面实现了最大的飞跃.A100 GPU具有革命性的硬件功能,CUDA 11与A100一起 ...

  9. CUDA 11功能展示

    CUDA 11功能展示 CUDA 11 Features Revealed 新的NVIDIA A100 GPU基于NVIDIA安培GPU架构,实现了加速计算的最大一代飞跃.A100 GPU具有革命性的 ...

随机推荐

  1. iOS学习-创建带下划线的button

    UIButton *tempBtn = [UIButton buttonWithType: UIButtonTypeCustom]; tempBtn.frame = CGRectMake(, , , ...

  2. SpringMVC的小总结

    ---恢复内容开始--- 前言: springMVC是我接触的第一个框架,当时在学校学习的时候还是各种懂,最简单的springMVC框架的配置还是比较熟,后来工作之后,虽然主要用的确实是springM ...

  3. Git忽略.gitignore规则不生效的解决办法

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件). 这个文件每一行保存了一个匹配的规则例如: # 此为 ...

  4. C# mysql 获取所有表名

    public static List<string> GetAllTableName()        {            List<string> retNameLis ...

  5. 2016总结&2017计划

    2016总结 总体而言,上半年比较勤快,下半年偷懒了.下半年仔细看了Barfoot的书<state estimation for robotics>,收获很大. 2017计划 目前打算写以 ...

  6. [信安presentation]Fight against GFW

    Section1:加密 加密算法分为:对称加密算法.非对称加密算法.Hash 1.1对称加密算法 加密解密使用相同的密钥 eg:DES,AES,RC4,RC5,Triple DES 缺点:1.因为加密 ...

  7. C#微信公众平台接入示例代码

    http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 这是微信公众平台提供的接入指南.官网只提供了php的示例代码 ...

  8. supervisor监管进程max file descriptor配置不生效的问题

    配置了 sudo vim /etc/security/limits.conf * soft nofile * hard nofile   单独起进程没问题, 放到supervisor下监管启动,则报错 ...

  9. Linux 下 ---ThinkPHP 图片上传提示:上传根目录不存在!请尝试手动创建

    2016年11月15日11:15:47 Windows下如果碰到如此问题,要看文件保存根路径里的rootpath,比如ThinkPHP框架里config.php文件里的的参数配置: //文件上传相关配 ...

  10. iframe的sandbox使用

    sandbox:限制iframe的权限,解决安全性问题. 定义 如果被规定为空字符串(sandbox=""),sandbox 属性将会启用一系列对行内框架中内容的额外限制.sand ...