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
我对这种行为感到惊讶,它提出了两个问题:
- 出于好奇,png格式有一定的自由度吗?在哪里?
- 出于测试目的,我需要一个稳定的输出。它可以实现吗?例如,我可以设置种子吗?
我已经尝试设置 -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
我注意到 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
我对这种行为感到惊讶,它提出了两个问题:
- 出于好奇,png格式有一定的自由度吗?在哪里?
- 出于测试目的,我需要一个稳定的输出。它可以实现吗?例如,我可以设置种子吗?
我已经尝试设置 -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