【问题标题】:Print md5 hash of an image opened with Python's PIL打印使用 Python 的 PIL 打开的图像的 md5 哈希
【发布时间】:2014-06-09 18:32:39
【问题描述】:

如何在 PIL 中打开图像,然后打印图像的 md5 哈希而不将其保存到文件并读取文件?

【问题讨论】:

  • 你是如何打开图片的?
  • 如果您的意图是生成文件的哈希,请不要使用PIL 打开文件,将其作为常规文件打开。如果您的意图是散列图像像素值,请参阅tostring
  • @MarkRansom,当您说“图像像素值”时,您是指图像中的数据减去 EXIF 标签吗?是的,这正是我想要做的。最好的方法是什么?

标签: python md5 python-imaging-library


【解决方案1】:
from PIL import Image
import hashlib

md5hash = hashlib.md5(Image.open('test.png').tobytes())
print(md5hash.hexdigest())

【讨论】:

    【解决方案2】:

    您可以将图像保存到io.BytesIO(),并获取其值的md5 哈希:

    import hashlib
    import Image
    import io
    
    img = Image.open(FILENAME)
    m = hashlib.md5()
    with io.BytesIO() as memf:
        img.save(memf, 'PNG')
        data = memf.getvalue()
        m.update(data)
    print(m.hexdigest())
    

    这将计算相同的 md5 哈希,就像您将 Image 保存到文件中一样,然后将文件读入字符串并获取字符串的 md5 哈希:

    img.save(NEWFILE, 'PNG')
    m = hashlib.md5()
    data = open(NEWFILE, 'rb').read()
    m.update(data)
    print(m.hexdigest())
    

    请注意,如果Image 是从诸如JPEG 之类的有损格式加载的,那么您获得的 md5 哈希值可能与您从原始文件本身获得的哈希值不同,不仅因为上述代码将图像保存为PNG 格式,但是因为即使将其重新保存为JPEG,保存为有损格式也会产生不同的数据。

    【讨论】:

    • with io.BytesIO() as memf: - 如果我没记错的话
    • @Torxed:谢谢;这样更好。
    【解决方案3】:

    PIL/Pillow 有一个Image 方法tobytes(或旧版本中的tostring)将图像像素值存储在一个字节字符串中。只需在返回的字节字符串上运行您的哈希算法。

    这将比编写特定格式(如 PNG)更有效,因为它是内部使用的本机表示。

    【讨论】:

    【解决方案4】:

    Re:评论:忽略exif,如何将数据复制到新的Image 和md5 的字符串表示形式?

    from PIL import Image
    import md5
    
    img = Image.open('test.png')
    # assuming there is exif, if you should want it:
    exif_data = img._getexif()
    just_pixels = Image.new(img.mode, img.size)
    just_pixels.putdata(img.getdata())
    
    m = md5.new()
    m.update(just_pixels.tostring())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多