ImageMagick 转换缩略图输出因文件名而异

ImageMagick convert thumbnail output differs based on file name

我注意到 convert -thumbnail 的二进制输出根据文件名(或 inode 或其他元数据)而不同,应该注意的是视觉上没有区别。这是复制文件并生成缩略图的 bash 脚本:

#! /bin/bash
cp avatar.png avatar2.png
convert avatar.png -thumbnail 100x100 a.png
convert avatar2.png -thumbnail 100x100 b.png
diff a.png b.png

它输出: Binary files a.png and b.png differ

我对这种行为感到惊讶,它提出了两个问题:

我已经尝试设置 -seed 123456 但输出仍然不同。

我在 Ubuntu 20.04

上使用 ImageMagick 版本 6.9.10-23 Q16 x86_64 20190101

avatar.png:
avatar2.png:
a.png:
b.png:

回答

正如 fmw42 所解释的,不同之处在于元数据,可以使用 -strip 选项将其删除。这个脚本显示输出现在是稳定的,它表明生成的文件是字节对字节相等的:

#! /bin/bash
cp avatar.png avatar2.png
convert avatar.png -seed 123456 -thumbnail 100x100 -strip a.png
sleep 3 #delay in order to force different modify timestamp
convert avatar2.png -seed 123456 -thumbnail 100x100 -strip b.png
diff a.png b.png

额外学习

识别

可以使用 identify 来探索文件的格式:

identify -verbose a.png

没有剥离,文件创建时间和原始文件URL存储在生成的png中。令人惊讶的是,在使用strip时,我们仍然可以看到文件的创建和修改时间,但它不是存储在png中,而是来自文件系统。

比较

可以使用 compare 来计算两个图像之间的视觉差异:

compare -metric rmse a.png b.png diff.png