因为懒和人的忘性,之前作的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有须要的来参考。html
了解的人知道其价值所在,不知道的人就弃之如废物吧。git
本篇是JPEG解码系列的第一篇——JPEG文件格式概览。github
1. 图片文件的数据是什么?app
这是一幅人眼可视的图片:工具
这是其对应的二进制数据:(因为二进制数据量浩如烟海,只截取头部的一些数据,使用的工具是WinHex)编码
2. 为何须要文件格式来表达图像?spa
这就凸显了规范的重要性,使用同一套标准,各厂商都按照这个标准进行文件格式封装,那么你拿到别人的照片后就知道code
了如何进行(文件格式)解析和(jpeg)解码了。htm
这也好理解,不一样国家不一样语言的人们如何交流?使用通用的标准——英语。blog
jpeg文件格式也自有其标准,文件格式标准参考电联的JFIF,编解码标准参考电联的ITU-T81。
3. 标准文档太长,没耐心读下去,怎么办?
标准规范的页码都是很长的,用于照顾到各个角落和细节。
可是,各个厂商实现时,确定不会实现规范的所有内容,只需知足标准中最重要的一部分便可。
4. jpeg二进制数据解读
通常状况下,是按照这个顺序排列的:
TAG类型 | 数值 | 名称 | 其余备注 |
SOI | 0xFFD8 | Start of Image | 必带 |
APP0 | 0xFFE0 | application0 | 必带 |
APPn | 0xFFEn | applicationn | 可选带(APP1通常为Exif信息) |
DQT | 0xFFDB | Define Quantization Table | 必带 |
SOF | 0xFFC0 | Start of Frame | 必带 |
DHT | 0xFFC4 | Define Huffman Table | 必带 |
SOS | 0xFFDA | Start of Scan | 必带 |
compress data | 。。。 | 。。。 | 必带 |
EOI | 0xFFD9 | End of Image | 必带 |
以下为标注各类类型TAG,其中EOI在文件末尾未贴出来:
5. 关于各TAG的一些说明
5.1) 文件名末尾.jpg不表明真的是一个jpeg图片,由于你能够随意更改一个文件的后缀名。
5.2)JPEG文件必须以0xFF DB开头和以0xFF D9结尾。
5.3)DQT为量化表,该类型表有两个表,一个表示Y份量的量化表,另一个为UV份量共用的量化表。
其中,TAG后面的0x 00 43表示这个TAG组中除去TAG两个字节外,共有多少个字节组成,后面的0x00为第几张表。
量化表为DCT变换系数,因为是8x8的二维DCT变换,故系数个数为64,这也便是:0x43 - 3 = 0x40 = 64。
5.4)SOF为帧图像开始,记录了采样精度、图形宽/高、份量个数、水平/垂直采样因子、量化表号等信息。
例如,摘抄下SOF下的这几个字节:0x00 11 08 02 D0 03 E0 03 01 22 00 02 11 01 03 11 01
其中,0x00 11表明SOF下共有17字节;
0x08表明采样精度,几乎都是用8位进行采样精度,即一个像素点能够有2^8=256级过渡;
0x02 D0表明图像高,即0x02d0=720像素高;
0x03 E0表明图像宽,即0x03E0=992像素宽;
0x03表明份量表数,为3,分别表明Y、U和V的表;
0x01 22 00中第一个字节01表明量化表序号(从1开始),第二个22表明水平/垂直采样因子(高四位为水平采样因子,第四位为垂直采样因子),第三个00表明量化表id=0;
0x02 11 01中第一个字节01表明量化表序号为2,第二个11表明水平/垂直采样因子都为1,第三个00表明量化表id=1;
0x03 11 01中第一个字节01表明量化表序号为3,第二个11表明水平/垂直采样因子都为1,第三个00表明量化表id=2;
须要补充说明一下,采样因子和量化表的问题。
采样因子:该图象的Y份量的宽/高采样因子都为2,而UV份量的采样因子都为1,则在同一个方向上(水平或垂直方向),Y份量采样点是UV份量采样点的2倍,
若是图像Y份量宽高分别W和H,那么U和V份量只采样了W/2和H/2个点,这也表明原始图象的size=1.5*W*H。
有些图像的第一张表多是2和1或1和2,再或都是1,可是第二和第三张表的采样因子都是1。
量化表:Y份量使用一张量化表,UV份量使用另一张表,由于DQT表通常就两张。
5.5)DHT为霍夫曼表,由四个表组成,分表表明:
[0][0]——直流霍夫曼表0,Y份量直流部分解码时使用
[0][1]——直流霍夫曼表0,UV份量直流部分解码时使用
[1][0]——交流霍夫曼表0,Y份量交流部分解码时使用
[1][1]——交流霍夫曼表1,UV份量交流部分解码时使用
5.6)SOS为扫描开始,其表明霍夫曼表关系进行映射。
5.7)SOS后面就为真正的编码数据,这是数据的大头,相比于此,文件头的size实际上是很是之少。
5.8)EOI为图像结束的标志,图像必须以此结束。