JPEG 最新标准源码工作原理
来源:互联网 发布:excel表格数据透视图 编辑:程序博客网 时间:2024/06/01 20:14
以下翻译自IJG JPEG library,介绍该JPEG编解码库的代码工作流程,该库由C语言编写的,在2014年做了些新的调整。
对于应用程序来说,在生成JPG图片时,每次都需要提供一个扫描行的图像数据给JPEG 编码库,图像数据格式采用大家平常都用的非压缩数据格式,JPEG编解码库负责预处理颜色空间转换和其它一些预处理细节。
该JPEG 代码库包含一些有用的代码,这些额外增加的代码并非ISO标准规定,它们可以用来辅助程序员对图像数据做些预处理,包括颜色空间转换、提高/降低采样率、颜色量化等功能。
以下是JPEG 编码库的工作流程
1. 分配数据结构 JPEG 压缩对象(JPEG compression object)并对其初始化。JPEG 压缩对象数据结构用于内部保存了压缩参数和压缩的工作状态.
2. 指定压缩后的数据的存放位置(比如:输出到文件)
3. 设置压缩参数,包括图像大小、颜色空间等。
4. 调用jpeg_start_compress( )开始压缩
5. while(还有扫描行的图像数据需要压缩)
调用jpeg_write_scanlines( ); // 压缩一条扫描行的图像数据
6 调用jpeg_finish_compress( ); 完成图像的压缩
7. 释放数据结构JPEG compression object
以下是JPEG解码库的工作流程
1. 分配数据结构JPEG解压缩对象(JPEG decompression object) 并对其初始化
2. 指定压缩数据的存放位置(比如 一个JPEG图像文件)
3. 调用jpeg_read_header( ) 获取图形信息
4. 设置解压缩参数
5. 调用jpeg_start_decompress( ) 开始解压缩
while(还有扫描行的图像数据需要解压缩)
jpeg_read_scanlines( ) 读取下一个扫描行的图像数据
调用jpeg_finish_decompress( )完成图像的解压缩
6. 是否JPEG解压缩对象(JPEG decompression object)
在编解码的过程中我们可以调用jpeg_abort( )来暂停编解码的过程. 如果想完全停止编解码过程,只需要调用jpeg_destroy( )
JPEG compression and decompression objects虽然是两个不同的数据结构类型,但是他们之间还是共享了一些字段,这样jpeg_destroy( )函数就可以在两种数据结构同时工作。
JPEG库没有使用static变量,所有的状态都保存在结构体compression object 和decompression object中,因此可以同时对多张图片进行编解码,而互不影响。只需要在程序中分配多个JPEG compression object和JPEG decompression object即可.
JPEG库对于需要压缩的图像数据有格式要求,标准的输入图像格式是一个由图像像素组成的矩形数组,每一个像素都有一样的成分或者说颜色通道.应用 程序必须告诉JPEG library每个像素的组成和图像数据采用的颜色空间。许多应用程序会采用RGB图像数据或者灰度图像数据作为输入。
像素按照扫描行进行存储,每条图像数据从左至右进行扫描。每个像素的成分是紧邻的,比如:对于24-bit RGB真彩色图像而言,它在内存中的表示为: R, G , B, R,G,B,R,G,B...
每行扫描线的图像数据用数据类型JSAMPLE的数组表示,JSAMPLE起始就是unsigned char类型.
JPEG编解码库支持可以一次处理一条或多条扫描行的图像数据,但是不允许一次只处理一行图像数据的一部分. 图像的压缩过程是按照从上到下的顺序进行的。如果你的图片的所有数据都在内存中,你甚至只需要调用一次就完成整张图片的压缩,而不需要调用多次。但是更简单的方式是每次读入一行图片数据,压缩,再读取下一行的数据,这样在压缩和解压缩的过程,不需要占用太多的内存空间。
IJG JPEG编解码库对于压缩的图片每行或者每列支持1 到 64K的像素数量,每个像素的颜色通道数量可以为3 或1,这可以通过J_COLOR_SPACE 枚举常量来设定,典型值为JCS_RGB 或JCS_GRAYSCALE.
IJG JPEG编解码有大量的压缩参数需要设定,如果你不希望每次压缩前对每一个压缩参数都进行赋值,可以调用jpeg_set_defaults( )采用默认设置,一般情况下可以满足要求。如果还有个别压缩参数需要调整,只需要在调用jpeg_set_defaults( )后再进行而外的参数赋值即可。
你在调用jpeg_set_defaults( )之前需要必须正确设置in_color_space颜色通道.
- JPEG 最新标准源码工作原理
- 【数据压缩】JPEG标准与原理解析
- JPEG标准
- 百度最新搜索引擎工作原理
- jpeg源码
- HashMap 工作原理源码分析
- 注解工作原理源码解析
- Dynamics AX2012 标准权限控制工作原理
- JPEG标准DCT算法
- 圖形壓縮、解壓縮探討JPEG 原理
- 圖形壓縮、解壓縮探討JPEG 原理
- 【转】JPEG编码原理
- JPEG压缩原理
- 【转】JPEG压缩原理
- JPEG压缩原理
- JPEG 原理详细
- JPEG原理详细2
- JPEG压缩原理
- Android权限设置android.permission完整列表
- js 时间比较和js移动到顶部、移动到指定位置
- 霍夫变换相关的知识
- 强制用户使用administrator模式运行
- 65_leetcode_remove Duplicates from sorted Array II
- JPEG 最新标准源码工作原理
- STM32之bootloader
- Qt Quick 之 QML 与 C++ 混合编程详解
- cocos2d-x 3.0rc0 - bindings-generator 问题与解决
- jCIFS非法用户名验证绕过漏洞
- 复合控件分页控件参考代码
- [互联/数码] 新站长怎么推广网站 新站推广方法 推广新站的三种方法
- 「GUETOJ」P1042 孤独的桂电人
- SO_REUSEADDR的作用