初识jpg的byte组织信息
首先说明一下1你要对jpg文件的编码解码有一点基础我上传过资料 你请先看一下为好
2由于每种设备(如不同的数码相机或扫描设备)和软件(如ps或acd等)对jpeg的编码解码有所不同(如范式huffman表的构建)
在byte上的jpeg码流的组织有许不同
3在各种jpeg文件中baselinejpg(基线jpeg或译基本jpg)是最广泛的(iso要求任何jpg解码程序都要能解baselinejpg)
另外对于扩展jpg 就修复jpg来说有天然的困难 我们不要考虑之
因此我以一个baseline jpg文件来说明
4由于photoshop保存的jpeg是我知道的应用软件中最好最标准的jpeg文件格式(也可能是兼容性最好的)
我将以一个www.intohard.com的屏幕硬copy文件 00baselinejpg.jpg
在ps中保存为jpeg文件为例 来让大家先对jpeg的编码有所初认
事实上对于不同的质量因子ps中的jpeg文件其huffman表及量化表等是不同的
所以我的jpg文件在ps中是以8的精度保存的
还有一点 在ps中输出网页用的jpg与我们上述的jpg有一点不同 我会讲一下
5在一篇文章里要一下对jpeg的广度和深度有所了解比较困难因此我的初讲不会太深
目的是先让大家对jpeg有初步认识 有问题可跟贴
6因为我们的目的是以修复jpg为上 我不会以编程的方式来讲段的问题不过你要有所了解
winhex是分析jpg码流的好软件我们将以winhex来做分析
由于图片比较多在我发贴时 请你不要跟贴 00baselinejpg是我们要用winhex来研究的jpeg文件
jpg文件是由各种段(含段的标志 内容) 及压缩码流组成让我们开始认识它 01SOI图像开始
任何jpeg文件都是以ffd8的标志符开始无此标志符 任何软件都无法解码jpg文件 02app0
jpeg最早的交换文件(在appi段中的app0应用现在通常是1.2的版本)
在画图里你能看到jfif就是平时我们在软件中生成的都是jfif的jpeg文件
大多数的通用恢复软件用特征码找jpg文件时先找ffd8然后就会找代码4A46494600(jfif)以便确定之
(看一下winhex的File Type Signatures.txt文件就知道了)
本图示有段的说明(以下图示相同)
因为段的内容说明较多本文暂不讲解 03app1
jpeg的另一种交换文件exif(在appi段中的app1和app2的扩展应用)
exif是日本数码相机的标准格式 现在新版本是2.2在jpeg的标准扩展应用中应该属于jpeg tiff标志头的应用
由于现在数码相机的流行 exif也是我们常见的jpg文件了(exif也以jpg为扩展名)
标准的exif文件头是没有ffe0所以以恢复数码相机文件的软件其算法是以考虑45786966(exif)代码为其次
这就是为什么有的软件有针对性的原因
03app1跳转偏移
ffe1是标志符 1c24是段长(但不包括ffe1两个字节)在转到偏移地址(图示)后 你就会看到下一个标志符ffed(
见04appi中photoshop的扩展应用图)
以下图示相同 就不多言了 在ffd1中保存有数码相机 拍照时间 应用软件名称软件修改时间等
ffd2中记录有色彩空间也可能没有ffe2
因为每个标志段内容不能超过64k所以可能会出现多个appi 如两个ffe1 ffe2等
实际上因为 ffe1 ffe2属于appi的定义 而exif使用app1及app2
其扩展定义使其可有多个即app1 app2 可以有多个
通常ffe1前者中记录有缩略图及exif中常用的扩展定义 如相机生产者 型号日期创建时间等
而后一个ffe1记录有adobe对于可扩展元数据平台(xmp)功能的扩展支持
实际上exif中的扩展定义使其甚至能带音频文件头这就是我们有的数码相机对于拍照的jpg文件可加文字说明或音频说明的原因 appn(ffe0-ffef) 是让jpeg能交换的扩展部分 真正的文件从dqt(ffdb量化表开始)
到12SOS扫描行开始 都是jpeg的段的内容没有此 任何软件无法解码jpg 11301压缩码流.jpg图所示003f00后的码流才是真正的压缩熵信息 以ffdd中定义的mcu块大小分隔的第一个标志符rst(ffdi 通常的应用软件及扫描文件都没有rst exif也没有)
有rst对于jpeg的修复毫无疑问是太好了但遗憾的是大多数应用软件编码的jpg是没有rst的 FFD9(EOI)是jpg文件的结束标志正常的解码到此就停止解码不过没有ffd9的结束标志 jpeg的文件也是可以解码的