好的,所以我尝试使用 imagemagick 命令:
"convert picA.png -interlace line picB.png"
制作我的 .png 图像的交错版本。大多数时候,我得到的结果图像比原始图像大,这很正常。但是,在某些图像上,生成的图像尺寸较小。
所以我只是想知道为什么会发生这种情况?我真的不希望我的新图像因为该命令而失去任何质量。
另外,隔行扫描的 .png 图像是否存在兼容性问题?
编辑:我想我的问题是原始图像没有尽可能地压缩。
最佳答案
以下仅适用于像素大小 >= 8 位的情况。我没有调查其他案例,但我预计会出现类似的结果。
由于处理 channel 扫描线所需的过滤器类型描述的附加数据,内容相同的隔行 PNG 图像文件几乎总是更大。这是我在this web page中详细解释的基于 PNG RFC RFC2083 。 简而言之,这是因为每个隔行扫描 channel 的隔行过滤器类型描述的以下字节数之和几乎总是大于图像高度(即非隔行扫描图像的过滤器类型数量):
nb_pass1_lines = CEIL(height/8)
nb_pass2_lines = (width>4?CEIL(height/8):0)
nb_pass3_lines = CEIL((height-4)/8)
nb_pass4_lines = (width>2?CEIL(height/4):0)
nb_pass5_lines = CEIL((height-2)/4)
nb_pass6_lines = (width>1?CEIL(height/2):0)
nb_pass7_lines = FLOOR(height/2)
不过,从理论上讲,数据熵/复杂性可能意外被 Adam7 interlacing 降低得足够多。这样,在过滤的帮助下,具有交错的过滤器类型通常所需的额外空间可以通过 deflate compression 进行补偿。用于 PNG 格式。这将是一个需要证明的特殊情况,因为熵/复杂性更有可能随着隔行扫描而增加,因为图像数据通过隔行扫描解构变得不太一致。
我使用了“意外”这个词,因为降低数据熵/复杂性并不是 Adam7 交错的目的。其目的是允许通过传递机制逐步加载和显示图像。而降低熵/复杂度是filtering的目的。对于 PNG。
我使用“通常”这个词是因为,如explanation web page所示例如,无论是否隔行扫描,都将通过相同长度的未压缩数据来描述 1 像素图像。因此,在这种情况下,不需要额外的空间。
就 PNG 文件大小而言,隔行扫描的文件大小较小可能是由于:
- 文件中嵌入的不同非像素编码相关内容,例如调色板(在颜色类型=!3的情况下)和非关键 block ,例如色度、 Gamma 、有效位数、默认背景颜色、直方图、透明度、物理像素尺寸、时间、文本、压缩文本。请注意,根据所使用的软件和情况,部分非像素编码相关内容可能会导致图像显示不同。
- 与不同像素编码相关的内容(可能会改变图像质量),例如位深度、颜色类型(因此是否使用调色板,颜色类型 = 3)、图像大小等。
- 与压缩相关的不同内容,例如更好的过滤选择、如上所述由于隔行扫描而意外降低的数据熵/复杂性(理论上的特殊情况)、更高的压缩级别(如您所提到的)
如果我必须检查 2 个 PNG 图像文件在像素方面是否等效,我会在 bash 提示符中使用以下命令:
diff <( convert non-interlaced.png rgba:- ) <( convert interlaced.png rgba:- )
它应该返回没有差异。
对于兼容性问题,PNG编码器和PNG解码器是否实现PNG RFC的强制方面,我认为交错没有理由导致兼容性问题。
编辑2018年11月13日:
一些基于具有小生境机制的自动进化分布式遗传算法的实验(托管于 https://en.oga.jod.li )解释如下: https://jod.li/2018/11/13/can-an-interlaced-png-image-be-smaller-than-the-equivalent-non-interlaced-image/
这些实验表明,等效的 PNG 图像的隔行图像的尺寸可能比非隔行图像的尺寸更小。最好的图像是高的,它们有一个像素的宽度,并且具有随机出现的像素内容。不过,形状并不是隔行图像比非隔行图像小的唯一重要方面,因为相同形状的随机情况会导致不同的尺寸差异。
所以,是的,某些 PNG 图像在像素方面和非像素相关内容可以是相同的,但隔行扫描的尺寸比非隔行扫描的尺寸更小。
关于image - 隔行扫描 .png 文件的大小如何小于原始文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37867463/