可视化和理解JPEG格式

2020-07-10 12:55:37

JPEG(联合图像专家组)是图像编码,JFIF(JPEG文件交换格式)是文件格式存储。

国际电联T.81|国际标准化组织IEC 10918-1:信息技术.连续色调静止图像的数字压缩和编码.要求和指南。

类型由标记定义:2字节,FF,然后是非零字节(*)。

长度是2个字节的大尾数顺序,并且覆盖了大小本身。因此,整个片段的长度是2+长度(以覆盖标记的长度)。这也意味着任何数据段的长度都不超过65537个字节。

(*)此非零字节规则很重要:如果任何数据编码将输出FF字节,则应在其后面编码文字00,以表示它是FF字节的数据,而不是段标记。

JPEG整体结构:扫描也是一个片段,但ECS只有在扫描之后才有可能。

文件末尾的终止符称为图像结束(EOI):FF D9。

重新启动标记FF D0-D7,它们只是ECS数据中间的可选指示器。

扫描的开始是一个正确定义的TLV段。紧接着,熵编码段开始,尽管段名称相同,但它不遵循任何类似的约定。

这很可能使ECS可以增长到任何大小,超过通常的65537字节限制:它们代表了文件的大部分数据-公平地说,JFIF格式具有误导性:结构良好的块中间有一个不清楚的巨大ECS斑点。

它的长度事先是未知的,也不是在文件中定义的。获得它长度的唯一方法是解码或快进:只需向前扫描FF字节。如果它是重新启动标记(后跟D0-D7)或数据FF(后跟00),则继续。

大多数JPEG文件都以FF D8 FF E0 00 10.J.F I.F 00开头,这会导致以下错误假设:

签名既不是偏移量0处的FF D8 FF E0,也不是偏移量6处的JFIF。

图像标记开始,FF D8。这是签名,在偏移量0处强制执行。

A段:具有应用0标记(编码的FF E0)和长度16(编码的00 10)。

但许多JPEG在偏移量3处没有FF E0段,例如那些具有EXIF信息且开头如下的JPEG:

默认标头';即APP0不包含尺寸或色彩空间等典型信息,这实际上使它们成为可选的(!)。

据我们所知,缩写格式(其中在不重新共享报头的情况下传输几个JPG)没有实现。

E0:APP0应用程序段0(JFIF(len>;=14)/JFXX(len>;=6)/AVI MJPEG)。

JP2文件以Atom/Box结构开始(类似于MP4/mov,具有典型的ftyp原子.),然后最终包含一个长度为0的框(直到文件末尾),然后包含JFIF段/标记结构,具有以下内容。

JPG图像的纯拼接。紧跟在EOI之后的是下一帧的新SOI。请参见FFMpeg MJPEG编解码器。

Motion-JPEG A(实际JFIF):开始时类似于JFIF图像,先是FF E1 app1,然后是mjpg标签,然后是标准的JFIF结构(标记,00填充的ECS)。

Motion-JPEG B(不是JFIF):直接作为mjpg标记开始,然后没有用于各种段的JFIF标记,因为mjpg标题包含指向量化表、霍夫曼表、帧开始和扫描开始的指针.。ECS数据不是00字节填充的。

尽管有规范,但在偏移量0处不强制实施APPX段。他们甚至不是必需的。

要使JPEG无损存储数据,请使用灰度、100%质量,然后使用宽度或8到1像素,或将填充的数据复制8次(JPEG图像存储在8x8块中)。

ECS很容易超过64KB,而注释段被限制为64KB,因此要在注释中存储大的JPEG,请通过使JPEG渐进式或通过JPEGTran的多重扫描进度控制使用自定义扫描来拆分扫描