image - 隔行扫描 .png 文件的大小如何小于原始文件?

标签 image imagemagick png interlacing

好的,所以我尝试使用 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 文件大小而言,隔行扫描的文件大小较小可能是由于:

  1. 文件中嵌入的不同非像素编码相关内容,例如调色板(在颜色类型=!3的情况下)和非关键 block ,例如色度、 Gamma 、有效位数、默认背景颜色、直方图、透明度、物理像素尺寸、时间、文本、压缩文本。请注意,根据所使用的软件和情况,部分非像素编码相关内容可能会导致图像显示不同。
  2. 与不同像素编码相关的内容(可能会改变图像质量),例如位深度、颜色类型(因此是否使用调色板,颜色类型 = 3)、图像大小等。
  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/

相关文章:

image - 如何使用来自单个 PNG 图像的可搜索文本构建 PDF?

css - SVG 数据图像不能用作伪元素中的背景图像

c - 在linux中显示来自C的gif gif87a图像的最佳方法

opencv - 从面对页面扫描中裁剪页面

JPEG2000 的 PythonMagick 数据提取

image - PNG 到 eps 转换文件大小大幅增加

visual-studio-2008 - Visual Studio 2008 资源编辑器对 PNG 很烦人

python - 如何在数据库中存储应用引擎图像对象?

image - 在 UITree Matlab 中单击节点时在面板中显示列出的图像?

python-3.x - 如何使用魔杖扭曲图像