简介
JPEG8存在两个非标准的扩展:
- 状态信息(Status Information, 必选项)
- 内嵌的图像信息(Embedded Image information, 可选项),比如缩略图(thumbnail image)
基础JPEG数据结构中,任何非标准的或额外的数据在它被放到兼容标准JPEG的图像查看器程序之前,需要被去掉。JPEG8数据流如下图所示:
编码器中的JPEG8数据流
解码器中的JPEG8数据流
JPEG数据定义
在相机模块中产生的JPEG数据是ISO/IEC 10918-1中所定义的基线JPEG DCT格式外加如下额外的定义或改动:
- 使用sRGB色彩空间。在sRGB转换为YCbCr格式之后,JPEG由YCbCr数据生成。
- JPEG元数据必须是EXIF兼容的,即应用片段内的元数据要放到文件开头,元数据顺序如下图所示:
兼容EXIF的基线JPEG DCT格式
- JPEG数据的结尾处增加一行状态行(Status Line)
- 如有需要,内嵌的图像可按照任意选择的顺序交织(Interlaced)
- 在存储到文件前,CSI-2 JPEG数据经过数据分离过程(data separation process)所处理
基线JPEG帧结束后的状态信息
状态信息放到了基线JPEG帧的结束位置,至少要存储一下项的信息:
- 图像曝光时间
- 所使用的模拟&数字增益
- 每个颜色分量的白平衡增益
- 相机版本号
- 相机寄存器设置
- 图像分辨率,以及可能的缩略图分辨率
相机寄存器设置可能包含了相机寄存器的一个子集。JPEG8图像所需要的关键信息就是将图像转换回线性空间所需要的信息。这对于某些应用比如打印服务是必要的。如下是一个寄存器设置的示例:
- 采样频率
- 曝光
- 模拟和数字增益
- 伽马
- 色域(Color gamut)转换矩阵
- 对比度
- 亮度
- 预增益(Pre-gain)
每个包含了JPEG8特性的而相机模块,必须在其产品规范中定义好状态信息内容。格式和内容由厂商自定。
图像状态信息在排布上,要按照如下规则:每个字节分为两个小的4-bit块,每个块的前面用“1010”序列填充,如下表所示:
这是为了确保在状态数据中不会出现JPEG escape序列(0xFF,0x00)。
内嵌图像(Embedded Images)
如有需要,可以在JPEG数据中嵌入图像。内嵌图像特性对于包含JPEG8特性的相机模块来说并非是强制性的。一个内嵌数据的例子是24-bit RGB缩略图。
内嵌图像(Embedd Image)数据可以在压缩图像数据段中的任意位置,也可以根据需要有任意多个数据块(pieces)。如下图所示:
压缩JPEG数据块内的TN Image嵌入信息例子
内嵌图像数据通过SOEI(Start Of Embedded Image)和EOEI(End of Embedded Image)非标准标识和压缩数据区分开来。SOEI和EOEI所分开的域段数量没有限制。
一个EI数据域段内的图像数据的像素到字节的打包过程,和其CSI-2数据类型相同的数据所指定的规则要相同。但是还有一个额外的限制,内嵌的图像数据不会产生任何错误的JPEG标识序列(0xFFXX)。
为了避免在内嵌图像数据中出现错误的JPEG标识码,推荐对像素数据值的范围进行限制,例如:
- 对于RGB888数据,推荐的解决错误同步码的方法是限制R,G,B值的范围为1到254。
- 对于RGB565数据,推荐的解决错误同步码的方法是限制G分量的范围为1到63,R分量值的范围为1-30。
每个EI数据域段由SOEI/EOEI标识所分隔,并且每个EI数据必须包含相同数量的字节以及一个完整的像素数量。一个EI数据域段可以包含图像数据的多行或一副完整的图像帧。
内嵌图像数据是单独解码的,在写入JPEG数据到一个文件前会和JPEG压缩数据分开。在这个过程中,EI数据域段按照接收到的JPEG数据中出现的顺序,一个接一个地接起来。
JPEG8 非标准标识(Marker)
JPEG8使用了保留的JPEG数据标识码用于特殊目的,用来标记数据文件中的额外的数据段。这些数据段并不是JPEG,JFIF,EXIF或任何其他规范的一部分,相反,它们的使用由本规范所指定。
这些非标准标记总是在包含了JPEG8相机模块的产品内部使用,并且这些标记总是在保存JPEG数据到文件前被移除。
JPEG8额外标记编码表
JPEG8数据接收
压缩数据格式的字节到32-bit内存字的映射关系,和通用CSI-2规则一致。
JPEG8数据格式接收