欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析JPEG/Exif/TIFF格式:图像压缩与存储原理详解

时间:11-07 神话故事 提交错误

大家好,感谢邀请,今天来为大家分享一下深入解析JPEG/Exif/TIFF格式:图像压缩与存储原理详解的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

JPEG是第一个针对连续色调静态图像(即包括灰度图像和彩色图像)的国际图像压缩标准。其最初的目的是利用64Kbps的通信线路传输720576分辨率的压缩图像。通过损失很少的分辨率,图像所需的存储量可以减少到其原始大小的10%。由于其高压缩效率和标准化要求,已广泛应用于彩色传真、静止图像、电话会议、打印和新闻图片的传输。但这些删除的数据在解压时无法恢复,因此*.jpg/.jpeg文件不适合放大查看,并且输出为印刷品时会影响质量。

JPEG 文件格式

JPEG 文件格式通常有两种文件扩展名:jpg 和.jpeg。这两个扩展的本质是相同的。我们可以将.jpg 文件重命名为.jpeg,而不会对文件本身产生任何影响。严格来说,JPEG 的文件扩展名应该是.jpeg。由于DOS时代的8.3文件名命名原则,所以使用.jpg的扩展名。这种情况类似于.htm和.html之间的区别。

JPEG 标准没有指定任何固有的文件格式。它仅定义压缩比特流的语法。这就产生了一定数量的文件格式来存储JPEG压缩图像,例如JPEG文件交换格式(JFIF),并且JPEG已扩展到TIFF6.0、FlashPix等。但它们中的每一种都不能被认为是正式定义的国际格式标准由国际标准委员会支持。

JPEG格式可分为三种格式:标准JPEG、渐进式JPEG和JPEG2000。

这种类型的标准JPEG: 图像文件在Internet 上广泛使用。图片完全加载读取后才能看到全貌;它是一种非常灵活的图像压缩方法,用户可以调整压缩比和图像质量之间的权衡。但一般来说,压缩比在10:1到40:1之间。压缩比越大,质量越差。压缩比越小,质量越好。 JPEG格式主要压缩高频信息,并且很好地保留了颜色信息。适合在互联网上使用,可以减少图像传输时间,可以支持24位真彩色,也常用于需要连续色调的图像。由于JPEG可以提供有损压缩,因此压缩率可以达到其他传统压缩算法无法比拟的水平。其压缩方式包括以下几种:

顺序编码

渐进式编码

无损编码

分层编码

JPEG压缩步骤

颜色转换:由于JPEG仅支持YUV颜色模式,不支持RGB颜色模式,因此在压缩彩色图像之前必须转换颜色模式。转换完成后,还需要进行数据采样。一般采用的采样比例为2:1:1或4:2:2。由于此项工作后仅保留每两行数据中的一行,因此采样后的图像数据量将被压缩到原始大小的一半。

DCT变换:DCT(DiscreteConsineTransform)是对图像信号进行频域变换,分离高频和低频信息的过程。然后对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。首先将图像划分为多个8*8的矩阵。然后对每个矩阵进行DCT变换(这里省略变换公式)。变换后得到频率系数矩阵,其中频率系数均为浮点数。

量化:由于后续编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,转换为整数。因为经过数据量化后,矩阵中的数据都是近似值,与原始图像数据不同。这种差异是图像压缩后产生失真的主要原因。

编码:编码采用两种机制:一种是0值的游程编码;另一种是熵编码(EntropyCoding)。在JPEG中,使用Z字形序列,即矩阵中的元素以矩阵对角线的法线方向排列成Z字形图案。这样做的好处是,矩阵左上角附近数值比较大的元素排列在行程前面,而排列在行程后面的矩阵元素基本都是0值。游程编码是一种非常简单且常用的编码方法,这里不再详细描述。编码实际上是一种基于统计特性的编码方法。 JPEG 中允许使用HUFFMAN 编码或算术编码。

更多详情请参阅《色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV》、《视频采样,量化,编码,压缩,解码相关技术原理学习笔记》

Baseline JPEG/Basic JPEG:此类JPEG 文件存储方法从上到下扫描,并将每一行按顺序保存在JPEG 文件中。当打开该文件显示其内容时,数据将按照存储的顺序从上到下逐行显示。直到所有数据读取完毕,整个图片的显示就完成了。网上有这样的图片。如果没有指定图片的宽度和高度,就会导致重绘。

渐进式jpeg/渐进式JPEG:一个JPEG 文件包含多个扫描,这些扫描按顺序存储在JPEG 文件中。在打开文件的过程中,首先会显示整个图像的模糊轮廓。随着扫描次数的增加,图像变得越来越清晰。此类图片是标准JPEG 格式的改进。当网页上下载渐进式JPEG图片时,首先呈现图片的大致外观,然后逐渐呈现具体细节,因此称为渐进式JPEG。这种通过HTTP2 多路复用传递渐进式JPEG 扫描层以提高感知性能和速度指数的方法早在2012 年就被Google 的John Mellor 注意到。他一直在试验SPDY 协议(HTTP2 的前身)。

JPEG2000:全新的图像压缩方式,压缩质量更好,改善了无线传输时信号不稳定造成的马赛克、位置混乱等问题。另外,作为JPEG的升级版本,JPEG2000的压缩率比标准JPEG高出约30%,并且支持有损和无损压缩。它还支持渐进式传输,即先传输画面的粗略轮廓,然后逐渐传输详细数据,使画面从模糊逐渐显示到清晰。另外,JPEG2000还支持感兴趣区域,也就是说可以指定图片上感兴趣区域的压缩质量,也可以选择指定的部分先解压缩。另一个优点是JPEG2000从无损压缩到有损压缩都兼容。

压缩步骤

由于JPEG 的有损操作模式并不比其他压缩方法更好,

因此,我们重点关注最常用的基线JPEG 算法(基线顺序)的有损压缩。以24位彩色图像为例,JPEG压缩步骤如下:

颜色转换

JPEG 支持使用任何色彩空间的图像,并支持1 到4 个颜色分量。灰度图像的颜色分量数量为1。RGB、YUV、YCbCr等有3个颜色分量。 4 种颜色成分的示例为青色、品红色、黄色和黑色(CMYK)。为了减少色度通道中包含的大量冗余信息,本例中使用YCbCr颜色空间。首先,您需要将颜色空间从RGB 转换为YCbCr:

Y=0.299000R + 0.587000G + 0.114000B

Cb=-0.168736R - 0.331264G + 0.500002B

铬=0.500000R - 0.418688G - 0.081312B

其中,Y代表亮度分量,Cb和Cr代表蓝红色分量。

直流电平偏移

最初,图像中的像素存储在无符号整数中。对于数学计算,在图像中的任何变换或数学计算开始之前,这些样本本质上被转换为二进制补码表示。直流电平偏移的目的是确保输入图像样本具有大约以零为中心的动态范围。由DC电平移位执行的图像采样仅由无符号数表示。

方法:假设图像分量的采样精度为n,那么分量中的每个像素值都要减去2的(n-1)次方。

对于图像来说,它们的样本由无符号整数表示,例如CT(X射线断层扫描)图像。动态范围已经集中在零附近,因此不需要直流电平偏移。

二次抽样

经过色彩空间转换后,图像的大部分空间信息都包含在亮度分量Y中,而色度分量Cb和Cr则包含大量冗余的色彩信息,因此我们采用色度数据量较少的子采样来压缩图像,同时丢失少量信息。基线JPEG常用的子采样格式是4:2:0,并且支持4:2:2和4:4:4颜色格式。

DCT变换

DCT(DiscreteCosineTransform)是对图像信号进行频域变换并分离高频和低频信息的过程。然后对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。首先将图像划分为多个8*8的矩阵。然后对每个矩阵进行DCT变换。变换后得到频率系数矩阵,其中频率系数均为浮点数。

量化

由于后续编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化并转换为整数。因为经过数据量化后,矩阵中的数据都是近似值,与原始图像数据不同。这种差异是图像压缩后产生失真的主要原因。

在此过程中,品质因素的选择极为重要。该值太大,可以大大提高压缩比,但图像质量会较差;反之,品质因数越小(最小为1),图像重建质量越好,但压缩比越低。对此,ISO制定了一套标准量化值供JPEG代码实现者使用。

右边两个量化表的设计是基于Lohscheller所做的心理视觉实验来确定二维基函数的可见阈值。

编码

从前面的过程可以看出,在完成颜色转换和编码之前,图像并没有进一步压缩。 DCT变换和量化可以说是为编码阶段做准备。

编码采用两种机制:一种是0值的游程编码;另一种是熵编码(EntropyCoding)。

之字形排序

在JPEG中,使用Z字形序列,即矩阵中的元素以矩阵对角线的法线方向排列成Z字形图案。这样做的好处是,矩阵左上角附近数值比较大的元素排列在行程前面,而排列在行程后面的矩阵元素基本都是0值。

使用RLE 编码AC 系数(AC)

游程编码是一种非常简单且常用的编码方法,这里不再详细描述。

需要说明的是,AC系数的锯齿序列编码中有两个特殊符号——(0, 0)和(15, 0)。第一个特殊符号是指块结束符(EOB),用于指示zigzag 块中的剩余元素为零。另一个特殊符号是零游程长度(ZRL),用于表示16 个零游程。基线JPEG 中允许的零游程的最大长度为16。如果这里有超过16 个零,则该游程将被分为多个长度为16 的零游程。

使用DPCM 编码直流系数(DC)

在对DCT系数进行量化之后,通过差分编码对量化后的DC系数进行编码。前一个块的DC系数减去当前块的DC系数,然后对差值进行编码,如右图所示。这利用了相邻块的DC 值之间的空间相关性。

熵编码:编码实际上是一种基于统计特性的编码方法。 JPEG 中允许使用HUFFMAN 编码或算术编码。基线JPEG算法(基线顺序)使用前者。

RLE编码的AC系数可以映射到两个标志(RUNLENGTH,CATEGORY)和(AMPLITUDE)。前者采用Huffman编码,后者采用VLI编码。同理,DPCM编码后的DC系数也可以映射成两个标志(CATEGORY)和(AMPLITUDE)。前者采用Huffman编码,后者采用VLI编码。

基线JPEG 允许使用4 个霍夫曼表,其中两个用于AC 系数编码,两个用于DC 系数编码。

如何识别JEPG文件

其实很简单。就是判断前3个字节是什么。如果发现是从FF D8 FF开始的,那么就认为是JEPG图片。

JPG 文件由数据段组成。段的数量和长度不确定。只要包含足够的信息,就可以打开JPEG 文件。

JPEG 格式和标签

JPEG图像格式组成:SOI(文件头)+APP0(图像识别信息)+DQT(定义量化表)+SOF0(图像基本信息)+DHT(定义哈夫曼表)+DRI(定义重启间隔)+SOS(开始时间)扫描行)+ EOI(文件结尾)

以十六进制方式打开JPG文件,你会发现

JPEG文件中存在一些0xFF**形式的数据,这些数据被称为“Markers”,代表JPEG信息数据段。例如,0xFFD8代表SOI(图像开始),0xFFD9代表EOI(图像结束)。

标记0xFFE0~0xFFEF 称为“应用标记”。它们对于解码JPEG 文件不是必需的,可用于存储配置信息等。EXIF 也使用此标记段来插入信息,具体为APP1(0xFFE1) 标记。所有的EXIF信息都存储在这个数据段中。

名称标签说明

SOID8 文件头

EOID9 文件结束

SOF0C0 帧起始(标准JPEG)

SOF1C1 同上

DHTC4定义哈夫曼表(Huffman table)

SOSDA扫描线开始

DQTDB定义量化表

DRIDD定义重启间隔

APP0E0定义交换格式和图像识别信息

DNLDC 标记代码

COMFE注释

段类型有30 种,但只有10 种必须被所有程序识别,其他类型可以忽略。

JPEG 格式和标记

SOI MarkerMarker XX尺寸=SSSSMarker YY尺寸=TTTTSOS Marker尺寸=UUUU图像流EOI Marker

FFD8FFXXSSSSDDDDD…FFYYTTTTDDDD…FFDAUUUUDDDD…I I I I…FFD9

0xFFE0~0xFFEF 之间的标签称为“应用标签”,它们在JPEG 图像解码中不需要存在。它们用于用户应用程序。例如,老式的olympus/canon/casio/agfa数码相机使用JFIF(JPEG文件交换格式)来存储图像。 JFIF 使用APP0 (0xFFE0) 标签插入数码相机配置信息数据和缩略图。

Exif也使用应用程序标签来插入数据,但Exif使用APP1(0xFFE1)标签以避免与JFIF格式冲突。每个Exif 文件格式都以它开头,例如

SOI标记标记XX尺寸=SSSS标记YY尺寸=TTTTSOS标记尺寸=UUUU图像数据流EOI标记

FFD8FFXXlo0pSSSSDDDD…FFYYTTTTDDDD…FFDAUUUUDDDD…I I I I…FFD9

Exif也使用application标签插入数据,但Exif使用APP1(0xFFE1)标签以避免与JFIF格式冲突。每个Exif 文件格式都以它开头,例如;

Exif 使用的标记

0xFF+标记数量(1字节)+数据大小(2字节)+数据(n字节)

SOI MarkerAPP1 MarkerAPP1 Data其他Marker

FFD8FFE1SSSS 457869660000 TTTT.FFXX SSSS DDDD.

图像文件以SOI (0xFFD8) 标记开头,因此它是JPEG 文件。紧接着是APP1 标签。并且其所有Exif数据都存储在APP1数据字段中。上面的“SSSS”部分代表APP1数据字段(Exif数据区域)。请注意,这里的大小“SSSS”包括描述符本身的大小。

‘SSSS’之后是APP1的数据。第一部分是特殊数据,用于标识是否为Exif,其值为ASCII字符"Exif"和两个0x00字节的组合字符串。

APP1 标签字段后面是其他JPEG 标签

exif数据分析

如果图片是16进制数据,则如下:

FFD9

那么FF D8是SOI标志位,FF E0是exif文件的起始位,接下来的四位是exif标记信息的长度。看来这个长度的数据解析成TIFFdata数据是没有问题的,而exif直接解析成字符串。

FF D8

FFE000 104A 46 49 46 00 01 02 01 00 60 00 60 00 00 mark0, 00 10=16 位

FFE108 3245 78 69 66 00 00 49 4910 60 00 60 20 00 ……mark1, 00 10=2098 位

……

图像流

FFD9

每个段都以FFxx 开头,其中xx 是段的标识符,后跟两位数的结束长度。接下来是数据。前面的元数据外读完成后,后面的二进制数据就是图像数据。

数据大小描述符(2字节)为‘Motorola’的字节顺序,数据的低位存放在高地址,即BigEndian。请注意,上面的“数据内容”包括先前的数据大小描述符。如果以下是标记;

长度采用高位在前、低位在后的方式表示,与Intel的表示方法不同。例如,如果一个段的长度是0x12AB,那么它将按照0x12、0xAB的顺序存储。但如果按照Intel的方法:高位在后,低位在前,就会存储为0xAB、0x12,这种存储方法对于JPEG来说是错误的。这样,如果程序无法识别JPEG 文件的某个段,它可以读取最后两个字节,获取该段的长度,然后跳过它。

关于exif信息解码请阅读《JPEG/Exif/TIFF格式解读(2):图片元数据保存及EXIF详解》

jpeg10 中所需的分段类型

以下是10 种基本细分类型:

APP0图像识别信息

名称字节值描述

段ID 1FF

段类型1E0

如果有RGB缩略图,段长度20010=16+3n

(以下为该段内容)

交换格式的ASCII 代码54A46494600“JFIF”

主要版本号1

次要版本号1

密度单位10=无单位; 1=点/英寸; 2=点/厘米

X 像素密度2 水平密度

Y 像素密度2 垂直密度

缩略图X 像素1 缩略图中的水平像素数

缩略图Y 像素1 缩略图中的垂直像素数

(如果“缩略图X像素”和“缩略图Y像素”的值都>0,则可获得以下数据)

RGB缩略图3nn=缩略图像素总数=缩略图X像素缩略图Y像素

阐明:

JFIF是JPEG File Interchange Forma的缩写,即JPEG文件交换格式。还有TIFF等格式,很少用。

“如果有RGB 缩略图=16+3n”是什么意思?例如,如果“缩略图X像素”和“缩略图Y像素”的值都是48,则表示有一个4848像素的缩略图(n=4848),并且该缩略图是24位的真彩色位图。用3个字节来表示一个像素,所以总共占用了3n个字节。但大多数JPG 文件都没有这种“鸡肋”的缩略图。

DQT定义量化表

名称字节值描述

段ID 1FF

段类型1DB

段长度243,其值=3+n(当只有1个QT时)

(以下为该段内容)

QT信息10-3位:QT号码

4-7位:QT精度(0=8位,1字节;否则=16位,2字节)

QTnn=64QT精度字节数

阐明:

JPEG 文件通常有两个DQT 段,一个为Y 值(亮度)定义,一个为C 值(色度)定义。

一个DQT段可以包含多个QT,每个QT都有自己的信息字节

参考:

图像文件Exif信息详细说明blog.sina.com.cn/s/blog_651251e60102uz3d.html#AboutExif

图像Exif信息元数据(Metadata)https://www.jianshu.com/p/a6d67df60e7e

关于图像文件旋转JPEG和EXIF的信息https://blog.csdn.net/yulimin/article/details/102827865

https://www.media.mit.edu/pia/Research/deepview/exif.html

https://baike.baidu.com/item/Exif/422825?fr=阿拉丁

读取JPG图像的Exif属性(一)-Exif信息介绍https://blog.csdn.net/fioletfly/article/details/53605959

读取JPG图像的Exif属性(二)——C代码实现https://blog.csdn.net/fioletfly/article/details/54094940

读取JPG图片的Exif属性(三)——Exif属性读取GPS信息代码(C/C++实现)https://blog.csdn.net/fioletfly/article/details/54133422

jpg图片添加Exif信息的C程序实现https://blog.csdn.net/psy6653/article/details/79658144

添加EXIF到JPEG https://blog.csdn.net/weixin_43549602/article/details/84654965

jpeg图像格式详解https://blog.csdn.net/yun_hen/article/details/78135122

压缩算法——JPEG2000编码解码原理https://blog.csdn.net/ytang_/article/details/76571635

PNG、JPEG、BMP等图像格式详解https://www.jianshu.com/p/f5557c0e689e

使用HTTP2 和渐进式JPEG 图像更快地加载图像https://www.zcfy.cc/article/performance-calendar-raquo-even-faster-images-using-http2-and-progressive-jpegs-2216.html

用户评论

凉月流沐@

终于有人把这些图片格式的细节都解释清楚了!

    有12位网友表示赞同!

孤独症

我一直对 JPEG 和 Exif 的工作原理感到好奇,很期待读这篇解析。

    有18位网友表示赞同!

日久见人心

想要了解更多关于图片压缩的方法,这篇文章肯定是我要看的!

    有6位网友表示赞同!

伪心

学习一下 JPEG 压缩技术,也许能帮助我更好地管理照片。

    有19位网友表示赞同!

闷骚闷出味道了

TIFF 格式真的比 JPEG 的质量高很多吗?想从文章里找到答案。

    有14位网友表示赞同!

三年约

以前没明白 Exif 数据到底有什么用,这篇文章应该能给我解答。

    有15位网友表示赞同!

发型不乱一切好办

对数字摄影感兴趣的人应该读这篇分析,了解图片背后技术的原理很关键!

    有13位网友表示赞同!

淡写薰衣草的香

看了标题,感觉作者一定把 JPEG 压缩的精髓都拿出来讲了。

    有5位网友表示赞同!

暖栀

学习这些知识对后期制作照片很有帮助!

    有6位网友表示赞同!

幸好是你

希望文章能解释清楚为什么 JPEG 图像会失去一些数据信息。

    有12位网友表示赞同!

非想

以后存储图片的时候,可以更好地理解不同格式的选择依据了。

    有17位网友表示赞同!

单身i

想深入了解 JPEG 格式的未来发展方向,这篇文章或许有相关信息。

    有19位网友表示赞同!

断桥残雪

分享给朋友,他最近在学习图像处理技术。

    有13位网友表示赞同!

夏至离别

文章内容是不是很专业啊?我也要跟着学习一下!

    有12位网友表示赞同!

蝶恋花╮

这个标题听起来就很有吸引力!

    有13位网友表示赞同!

等量代换

从文章中能学到一些调取 Exif 数据的技巧吗?

    有14位网友表示赞同!

此刻不是了i

很多图片处理软件都能打开 TIFF 格式,为什么 JPEG 更受欢迎呢?

    有14位网友表示赞同!

仰望幸福

看来 JPEG 压缩技术已经应用很广泛了!

    有19位网友表示赞同!

十言i

以后更清楚地理解照片中的信息来源和用途。

    有9位网友表示赞同!

闲肆

文章内容看起来很有深度,我相信能学到很多东西!

    有5位网友表示赞同!

【深入解析JPEG/Exif/TIFF格式:图像压缩与存储原理详解】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活