TJpgDec—轻量级JPEG解码器
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_prepare和jd_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_prepare和jd_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函数第五个参数确定。
在这个函数中,位图发送到帧缓冲或显示设备。第一个像素是位图矩形的左上角位置,最后一个像素是右下角位置。矩形的大小从1x1到16x16取决于图像的裁剪、缩放和采样因子。如果矩形是帧缓冲区,它将在函数中倍裁剪。
像素格式取决于JD_FORMAT参数的配置选项。当它配置为RGB888,位图是一个字节数组,每3个字节保存一个RGB像素:RRRRRRRR, GGGGGGGG, BBBBBBBB, RRRRRRRR, GGGGGGGG, BBBBBBBB, ...;配置为RGB565时,位图是一个WORD数组,RGB数据1word每像素:RRRRRGGGGGGBBBBB, RRRRRGGGGGGBBBBB, RRRRRGGGGGGBBBBB, ...。
资源
TJpgDec是一个免费软件,对教育、研究和开发开发。你可以使用、修改和重新分发它,对个人项目或商业产品没有任何限制和责任。
- 先读: TJpgDec 应用笔记2012年8月13日
- 下载: TJpgDec R0.01b 2012年9月3日
- 下载: TJpgDec 示例项目 (AVR, PIC24, LPC1114 and Win32)2012年2月19日
- 演示短片(MP4/3MB)
TJpgDec—轻量级JPEG解码器的更多相关文章
- 在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据
在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据 如今,最流行的拍照设备智能手机可以捕获高达4K UHD的图像(3840×2160图像),原始数据超过25 MB.即使 ...
- 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库 根据调查,普通人产生的1.2万亿张图像可以通过电话或数码相机捕获.这样的图像的存储,尤其是以高分辨率的原始格式, ...
- NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库
NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Lib ...
- TJpgDec使用说明
TJpgDec模块应用说明 [TOC] 怎么使用 首先,你应该构建和运行如下所示示例程序.这是一个典型的使用TJpgDec模块,它有助于调试和缩小问题. 解码会话分为两个阶段.第一阶段是分析JPEG图 ...
- DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像
背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...
- jpeg软解码实现介绍
我的月经贴博客该更新了!!!已经有许多博文需要补了! 去年开始的jpeg解码项目,中间停止更新了大半年时间,上个月想起这事还没完工,就又做了更多兼容性和性能上的改进,目前终于接近尾声了.有需要参考的可 ...
- 《HelloGitHub》第 57 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- CUDA 11功能清单
CUDA 11功能清单 基于NVIDIA Ampere GPU架构的新型NVIDIA A100 GPU在加速计算方面实现了最大的飞跃.A100 GPU具有革命性的硬件功能,CUDA 11与A100一起 ...
- CUDA 11功能展示
CUDA 11功能展示 CUDA 11 Features Revealed 新的NVIDIA A100 GPU基于NVIDIA安培GPU架构,实现了加速计算的最大一代飞跃.A100 GPU具有革命性的 ...
随机推荐
- [LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...
- Ceph RGW 创建默认的pool
使用Ceph-deploy完成RGW服务部署后(最好是在部署RGW服务前建立如下这些pool),使用sudo ceph osd lspools 命令,会发现RGW自动以默认参数创建了N个rgw相关的p ...
- SSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.( ...
- linux命令大全
host 命令 1,这个命令可以让您来查看主机的 ip 信息, 2,如果您还想查看 DNS 记录,可以使用 -a 参数 3,如果您需要查看域名服务器或者 SOA 信息,可以使用 -C 参数,或者您可 ...
- com.panie 项目开发随笔(NoF)_环境搭建(2016.12.29)
(一) 最近做的框架一直在 spring + springmvc + mybatis 的基础上,使用框架的好处自然是 简化了自己的开发工作,定义好大的结构体系后就在里面套用方法了! 可是框架的毛病同样 ...
- Android必学——AsyncTask
第一章 AsyncTask的基本构成 为是么要异步任务 1)Android单线程模型 2)耗时操作放在非主线程中执行 AsyncTask为何而生 1)子线程中跟新UI 2)封装.简化异步操作 pub ...
- BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 1473 Solved: 621[Submit][Statu ...
- C#做有模和非模式化窗体 传值例程
有模窗体:指的是一定要在第二个窗体上操作之后 才能去操作前者窗体 :例如,如果一个对话框,在可以切换到其它窗体或对话框之前要求先单击"确定"或"取消",则它就是 ...
- dom 节点篇 ---单体模式
<script> var creatTag={ oUl:document.createElement('ul'), oDiv:document.createElement('div'), ...
- 【原】小搞一下 javascript算法
前言:在前端大全中看到这句话,以此共勉.基础决定你可能达到的高度, 而业务决定了你的最低瓶颈 其实javascript算法在平时的编码中用处不大,不过不妨碍我们学习它,学习一下这些算法的思想,锻炼一下 ...