用于断言未更改视觉输出的图像校验和

image checksums for asserting unchanged visual output

我有一个从代码生成图像的库,我想编写一个功能测试套件,循环遍历多个测试用例并执行以下操作:

  1. 从测试用例创建 PNG 图像,
  2. 创建图像的校验和,并且
  3. 断言校验和与参考校验和相同。

通过与预先计算的参考校验和进行比较,我可以确定在不逐像素检查图像的情况下行为或库不会发生变化。

我注意到在创建 PNG 时,没有两个文件是完全相同的,尽管它们看起来很相似。我想各种时间戳总是存储在文件中。为此目的,这规定了(普通)PNG 文件。

什么是合适的文件 format/hash 算法来断言视觉输出没有改变?

无需编写应用程序来执行此操作,您可以只使用 ImageMagick。这是一个将 GIF 转换为 PNG、PPM 和 JPG 的示例,然后检查像素数据是否相同,无论其编码方式如何:

# convert logo.gif logo.png
# convert logo.png logo.ppm
# convert logo.png logo.jpg
# identify -verbose logo.gif logo.jpg logo.png logo.ppm | grep signature
signature: 5c701306a9a985a0c93c8d11a1e761d7f8637577697fc60d7189b221388f8edf
signature: 97fee507ef8464e2a9be00e65c615aa096e30abc925113ff5a43c4dbf0f94513
signature: 5c701306a9a985a0c93c8d11a1e761d7f8637577697fc60d7189b221388f8edf
signature: 5c701306a9a985a0c93c8d11a1e761d7f8637577697fc60d7189b221388f8edf

ImageMagick 是开源的,因此您可以获得一份副本并查看其功能。它将每个图像提升为 64 位 RGBA,然后计算生成的像素数组的 SHA 散列。请注意,三种无损格式都具有相同的签名,而 logo.jpg 由于有损编码而具有不同的签名。