JPEG 最新标准源码工作原理

以下翻译自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颜色通道.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值