转译自:https://www.impulseadventure.com/photo/jpeg-compression.html
当试图重新保存数码照片时,人们经常会面临使用“质量设置”(压缩级别)的决定。 JPEG文件格式(更恰当的是JFIF)允许选择文件大小和图像质量之间的适当权衡。重要的是要理解JPEG(以及几乎所有有损文件格式)不适合中间编辑,因为事实是 重复扫描通常会降低工作文件的质量。 除了视觉人工制品的累积引入(误差)之外,重复压缩还会引入破坏性的颜色变化。 正是由于这些原因,“无损”文件格式(如TIFF,PSD,BMP等)是中间处理的更好选择。 JPEG应仅用于存储最终图像(即编辑后)和可能的初始捕获。
JPEG压缩如何工作?
在图像编辑器中打开JPEG文件时,必须执行大量步骤才能显示或编辑原始图像(每个像素一个RGB三元组)。通过查看逆向过程更容易理解过程 - 即。当从原始图像数据生成JPEG文件(即保存)时会发生什么。总之,JPEG算法涉及以下阶段:
##色彩空间转换 - 图像首先经过色彩空间转换,从RGB(红绿蓝)三元组重新映射到YCbCr(亮度,色度蓝,色度红色)三元组。这种颜色空间转换有助于使用不同的量化表(一个用于亮度,另一个用于色度)。
##分割成块 - 原始图像数据被斩波为8x8像素块(这些块是最小编码单元)。这意味着JPEG压缩算法在很大程度上取决于这些边界的位置和对齐。
##离散余弦变换(DCT) - 将图像从空间域表示变换为频域表示。这可能是该过程中所有步骤中最令人困惑的,也是最难解释的。基本上,图像的内容被转换成数学表示,该数学表示基本上是波(正弦)模式的总和。例如,二进制序列101010可以由每两个像素重复的波表示。序列1100110011可以由每四个像素重复的波表示。类似地,序列1001101011可以由几个更简单的波的总和表示。现在想象一下,这种到波动方程的映射(称为DCT基函数)是在X和Y方向上完成的。
##量化 - 给定从DCT步骤得到的波动方程,它们按照低频分量(在图像块上较长距离发生的变化)的顺序排序到高频分量(每个像素可能发生的变化) 。众所周知,人类对低频信息中的错误比高频信息更为关键。 JPEG算法丢弃许多这些高频(类似噪声)的细节,并保留缓慢变化的图像信息。这是通过将所有方程系数除以量化表中的对应值然后将结果舍入到最接近的整数来完成的。在量化表中具有小系数或大除数的分量可能会舍入为零。质量设置越低,除数越大,导致零结果的可能性越大。相反,最高质量设置将具有全1的量化表值,这意味着保留了所有原始DCT数据。
这里要实现的一个重点是,用于该步骤的量化表在几乎所有数码相机和软件包之间是不同的。由于这是压缩或再压缩“错误”的最重要的贡献者,因此在从不同的压缩器/源重新存储时几乎总是会遭受图像劣化。相机制造商独立选择任意“图像质量”名称(或级别)来分配他们设计的64值量化矩阵,因此同一制造商不能在品牌甚至型号之间比较名称(即佳能的“精细”)与尼康的“精彩”)。
请参阅我的关于JPEG量化表的文章,了解Canon,Nikon,Sigma,PhotoshopCS2和IrfanView数码照片中使用的实际表格。
## Zigzag Scan - 量化后得到的矩阵将包含许多零。质量设置越低,矩阵中将存在越多的零。通过将矩阵从左上角重新排序为Z字形图案的64元素向量,矩阵基本上从低频分量到高频分量排序。由于高频分量最有可能舍入到零,因此通常会在64条向量的末尾以一串零结束。这对下一步很重要。
## DPCM on DC component - 在逐块的基础上,平均值的差异(整个块,DC分量)被编码为与前一个块的值的变化。这称为差分脉冲编码调制。
## RLE on AC组件 - 在64元素向量(AC组件)中的各个条目上,运行长度编码存储每个值以及它之前的零个数。由于1x64向量包含大量零,因此保存非零值然后计算这些非零值之间的零数会更有效。 RLE存储跳过和值,其中skip是此组件之前的零的数量,值是下一个非零组件。
##熵编码/霍夫曼编码 - 创建一个字典,它表示常用的带有shortercode的值字符串。更常见的字符串/模式使用较短的代码(仅编码几位),而较少使用的字符串使用较长的代码。只要字典(霍夫曼表)存储在文件中,查找编码的位字符串就很容易了。恢复原始值。请参阅我的JPEG霍夫曼编码教程。
检查你的JPEG文件!
我编写了一个免费的Windows实用程序,用于检查并显示JPEG文件中上述所有详细信息。
在这里下载JPEGsnoop。
错误来自哪里?
到目前为止,JPEG算法中错误的最大贡献者(即文件大小节省)是量化步骤。这也是允许用户进行调整的步骤。用户可以选择具有稍小的文件,同时保留大部分原始文件(即,高质量或低压缩比),或者文件尺寸小得多,在匹配原始文件时具有较低的准确性(即,低质量或高压缩)比)。通过选择与量化表一起使用的缩放因子来简单地完成调谐。
将系数四舍五入到最接近的整数的行为导致图像信息的丢失(或者更具体地,增加了误差)。对于较大质量的缩放因子(即,低图像质量设置或量化表中的高数字),截断或丢弃的信息量变得显着。正是这个阶段(当与压缩零的运行长度编码相结合时)允许显着的压缩能力。
压缩误差还有其他因素,例如色彩空间转换,但量化步骤是最重要的。
请参阅JPEG量化表文章中的结果,以便更准确地比较软件包及其质量设置。
JPEG色度子采样
为了进一步提高JPEG压缩率,使用色度子采样来减少要压缩的图像信息量。有关通常用于数码相机和图像编辑器(如Photoshop)的2x1和2x2子采样的更多信息,请参阅我的色度子采样文章。
JPEG压缩的突破?
到目前为止,人们普遍认为,就压缩率而言,JPEG图像压缩与itgets一样好(除非使用分形压缩等)。通过Zip或其他通用压缩程序再次压缩JPEG文件通常可以进一步改进尺寸(通常反过来,增加尺寸!)。
正如StuffIt(AllumeSystems,以前的Alladin Systems)的作者撰写的白皮书(不再可用)中所记录的那样,他们显然已经开发出了可以进一步压缩JPEG文件30%的软件!考虑到多年来高度压缩的JPEG算法已经存在多年,令人惊讶的是看到任何新的开发都提供了这种程度的增加压缩。请注意,“Stuffit ImageFormat”(SIF)使用有损压缩的原始JPEG图像的无损压缩。因此,此Stuffit附加压缩不会进一步降低图像质量。
在Slashdot.org上,有很多关于如何实现这种额外压缩的理论,但似乎很多人认为必须通过替换霍夫曼编码部分(并使用算术编码)或替代Z字形重新排序扫描。看来,共识是SIF使用了算术编码的实现。
乍一看,这似乎可能彻底改变照片行业。想象一下,这可能会影响在线图像主机或个人存档需求。节省30%的文件大小是一项重大改进。不幸的是,一些重大问题立即显现出来,可能会导致采用这种格式:
##专有标准 - 由于单个公司拥有该格式,我看不到这种格式起飞。您是否相信您的整个照片集合到一家公司的实用程序?该公司可以收取它喜欢的费用,对公司的未来有所保障,等等。至少Adobe试图通过向开放社区发布他们的DNG(数字负片格式)规范,允许许多其他开发者支持该格式。 Allume / Stuffit认为这是一个潜在的金融大奖。
## Processor Intensive / Slow - 与标准JPEG文件压缩方案中使用的方法不同,SIF方法显然非常低。经ACT(归档比较测试网站)测试,1.8 GHz Pentium计算机压缩或解压缩300万像素文件的时间约为8秒。例如,对于那些希望将照片存档到CD的人而言,这不是一个问题,但显然这会阻止算法在大多数嵌入式应用程序(包括数码相机中)中得到支持。
如果打算编辑JPEG文件并将其重新保存为JPEG,则应考虑重新压缩错误的问题。如果附加误差不会引起太大关注(尤其是它几乎不可见),那么重新设置以匹配文件大小可能是一个合适的解决方案。但是,如果目标是尽可能保留原始图像的细节,则必须仔细查看文件的保存方式。
重新开始和工作流程
在进行更改后重新保存时,我尽可能地保留原始质量,并且不会因压缩舍入错误而失去额外的细节。 因此,应该记住一些关于重新储存的建议:
Original | Save as... | Notes |
---|---|---|
TIFF | TIFF | 如果原始版本未压缩,那么将其重新保存为未压缩是有意义的 |
BMP | BMP | 如果原始版本未压缩,那么将其重新保存为未压缩是有意义的 |
JPG | TIFF or BMP | 最佳方法:通过以无损格式保存,可以最佳地保留细节。 不幸的是,这种方法使事情复杂化,因为大多数目录程序都不能很好地处理文件类型的更改(因为它更改了文件名)。 |
JPG | JPG | 替代方法:虽然不如以前的方法以无损格式保存它,但如果压缩算法相同(即相同的量化表和质量设置),这可能就足够了。 如果这是不可能的,那么使用足够高的质量设置(即,努力减少压缩比原始设置)重新启动可能是唯一的选择。 |
选项1 - 重新保存但没有重新压缩错误
所有宣传“无损”操作(例如无损旋转)的软件应用程序都将重新保存文件而不会产生额外的压缩错误。唯一可行的方法是,压缩算法中使用的设置是否与原始设置相匹配。设置的任何差异(更具体地说,量化表和质量设置/因子)将导致额外的压缩错误。
不幸的是,(作为用户)很难确定这些设置是什么,更不用说对它们有任何控制(除了质量因素)。除了cjpeg,我还没有看到任何其他程序,它实际上允许你自己配置量化表。
为了确定这个选项是否可行,我将数码相机的量化表与成像应用进行了比较。
幸运的是,如果一个人正在原始创建图像的应用程序中重新保存图像(例如,在Photoshop中保存图像,重新打开,编辑它然后在Photoshop中重新保存),那么只需使用相同的质量设置重新保存即可实现这一目标正如前一次使用的那样。由于量化表是硬编码的,因此用户必须确保质量设置与原始设置匹配(不高或低)。如果忘记了原版中使用的设置,可以通过执行几个测试保存来进行有根据的猜测,以便通过文件大小(跨质量设置)进行比较,以获得非常粗略的想法。
选项2 - 以最小的再压缩错误重新保存
如果正在使用与最初创建的原始程序不同的程序重新保存照片(例如,Photoshop CS直接从数码相机重新保存照片的编辑版本),则无法在没有额外“丢失”(重新压缩错误)的情况下重新保存。这里的问题是量化表和质量设置是未知的或者它们不能被设置。这是用户编辑数码照片的最可能方案。
在这种情况下,目标不再是“无损重新保存”,而是最小化将要引入的额外再压缩错误。通过一个非常粗略的假设,可以通过使用类似量化表的设置重新获得等效的细节级别。有很多原因,为什么这最终成为一个粗略的假设,但它应该给出相同的细节水平。
压缩质量和文件大小
以下详细介绍了JPEG质量对多个图像编辑程序的文件大小的影响。不幸的是,每个图形程序倾向于使用其自己的压缩质量比例和量化表,因此,不能简单地将质量设置从一个应用程序传送到另一个应用程序。
如上一节所述,如果不能保证无损重新保存(由于量化表的差异),那么在量化表比较中需要参考指南。
知道什么质量水平大致相当于原始图像有助于确定适当的重新保存质量水平。理想情况下,人们不希望以较低的质量水平重新保存(因此会丢失图像细节/质量),另一方面,人们不应该保持更高的质量设置,因为它只会浪费空间,实际上可以引入额外的再压缩噪声!
数码照片来源特征
用于比较目的的源文件是使用佳能10D数码单反相机拍摄的JPEG图像,以ISO 400记录600万像素图像(3072x2048像素)并具有超高质量。源文件大小为2280 KB。
Photoshop CS - JPEG压缩
有关更多详细信息,请参阅文章:Photoshop另存为vs Save for Web。
笔记:
## Photoshop CS2允许在“另存为”对话框中以0..12的整数增量进行一系列质量设置。
## Photoshop CS2允许在“存储为Web”对话框中以0..100的整数增量进行一系列质量设置。
##大约11的JPEG质量设置实现了与佳能10D数码单反相机(超精细模式)原始制作的文件大小相似的文件大小。
## Photoshop CS有三种保存JPEG的模式:基线,基线优化和渐进式。对于1 MB文件,这三种模式(逐行扫描到3次扫描)之间的文件大小差异大约为20 KB。当然,这取决于图像的内容,但它表明了在不同模式下预期的粗略数量级。
## ICC配置文件附加到图像上,但它只是默认的sRGB,这相对无关紧要(~4 KB)。
Photoshop CS和色度子采样
虽然没有做广告,但我确定Photoshop CS仅在某些质量等级设置中使用色度子采样。
Photoshop不允许用户选择是否在JPEG压缩中使用色度子采样。相反,2x2子采样用于质量6及以下的所有另存为,而对于质量7及更高版本的另存为,它被禁用(即1x1子采样)。同样,它用于质量50及以下的所有Save For Weboperations,而不用于Quality 51及以上的Save For Web。
Irfanview - JPEG压缩
笔记:
## Irfanview允许以0..100的整数增量进行一系列质量设置。
##它还允许用户选择是否在JPEG压缩中使用色度子采样。
##禁用色度子采样后,质量设置96似乎与原始文件大小相当。
##启用色度子采样后,大约98-99的质量设置会创建与原始文件相当的文件大小。但是,应该注意的是,数码相机本身正在使用色度子采样(2x1),因此这个数字并不是特别有用。换句话说,如果原始源使用色度子采样,那么在没有色度子采样的情况下没有重新存储的点 - 附加的CbCr颜色信息已经消失。在我用于上述分析的示例图像中,chromasubsampling在相同的JPEG压缩下提供了大约25%的文件大小节省。
杂项主题
小心Photoshop Save For Web
虽然Photoshop的Save for the Web对话框看起来很棒,因为它可以交互式地设置图像尺寸,调色板深度和压缩质量,但它会执行一个潜在的灾难性后果:EXIF元数据的移动!
您会发现使用“Save for the Web”后的文件大小将小于您使用相同压缩设置选择“SaveAs ...”时的文件大小。不同之处在于丢失的图像元数据(时间/日期/光圈/快门速度/等)。
唯一一次值得使用“为网络保存”是指创建网页图形(您正在优化速度)或故意想要消除元数据(例如照片库,隐私等)。