是否可以在保存之前计算 numpy 图像的 md5?

is it possible calculate md5 of numpy image before to save?

我正在尝试使用 MD5 作为文件名保存文件,为此我在 Numpy 数组中生成图像,有时可能是相同的图像,所以我想计算 MD5 以覆盖现有图像或避免保存。

问题是我从 NumPy 数组中获取的哈希值与最终保存的图像不同,为此我使用了以下代码:

hashlib.md5(array.astype("uint8")).hexdigest()

是否可以从 NumPy 数组计算 md5 哈希值,或者我需要用一个随机名称保存它并在其后重命名吗?

谢谢

根据评论并假设您保存的是 numpy 数组而不是图像文件,您可以这样做:

hash = hashlib.md5(array.tobytes()).digest()
np.save(hash, array)

以下内容非常不建议!

如果您必须保存图像,您应该按顺序:

  1. 保存图像(例如.png)
  2. 用hashlib消化文件内容
  3. 删除现有图像,如果有的话
  4. 重命名您的新图片

在代码中:

import hashlib
import os
from matplotlib.image import imsave
import binascii
imsave('myimage.jpg', image_array)
with open('myimage.jpg','rb') as f:
    ba = f.read()
_hash = hashlib.md5(ba).digest()
new_filename = binascii.hexlify(_hash).decode()+'.jpg'
if os.path.exists(new_filename):
    os.remove(new_filename)
os.rename('myimage.jpg',new_filename)

请避免这样做,正如@Mark 在下面评论的那样,此处复制:

You are calculating the md5 digest of a JPEG-compressed file so you will likely not detect if it corresponds to another identical Numpy array if 1) the JPEG is wriiten by a different library, or 2) different version of the same library, or 3) with different quality settings or 4) on a different date if the date is embedded in the metadata, or 5) to a different image format such as PNG