Python 来自pil对象的md5
如何在不保存到文件的情况下获取pil对象的md5Python 来自pil对象的md5,python,md5,python-imaging-library,Python,Md5,Python Imaging Library,如何在不保存到文件的情况下获取pil对象的md5 imq.save('out.png') hash = hashlib.md5(open('out.png','rb').read()).hexdigest() 您可以将其写入一个StringIO,然后对其进行散列。您可以使用下面的PILImage类方法获取原始图像数据,以馈送到md5() im.getdata()=>序列 将图像的内容返回为 包含像素的序列对象 价值观序列对象是 展平,使第一行的值 紧跟在 第零行,依此类推 请
imq.save('out.png')
hash = hashlib.md5(open('out.png','rb').read()).hexdigest()
您可以将其写入一个
StringIO
,然后对其进行散列。您可以使用下面的PILImage
类方法获取原始图像数据,以馈送到md5()
im.getdata()=>序列
将图像的内容返回为
包含像素的序列对象
价值观序列对象是
展平,使第一行的值
紧跟在
第零行,依此类推
请注意,使用此生成的MD5散列不会与示例代码相同,因为它(至少部分)独立于用于保存图像的特定图像文件格式。如果您想独立于可能保存的特定图像文件格式来比较实际图像,这可能会很有用
要使用它,您需要将图像数据的MD5散列存储在独立于任何图像文件的某个位置,在需要时可以在该位置检索图像数据,而不是像问题中的代码那样,通过将整个文件作为二进制数据读入内存来生成图像数据。相反,您需要始终将图像加载到PIL中,然后对其使用
getdata()
方法来计算哈希。将@Ignacio的答案转换为代码,使用以帮助:
正如参考的其他答案注释一样,如果PIL尝试自动检测输出格式,这可能会导致KeyError。要避免此问题,可以手动指定格式:
img.save(output, format='GIF')
(注意:我使用了“img”作为变量,而不是我认为是打字错误的“imq”)实际上有一个更简单的解决方案:
hashlib.md5(img.tostring()).hexdigest()
看起来.tostring()在2017年从2.0开始就被弃用,取而代之的是.tobytes()。tostring()不再受支持,请改用.tobytes()。当我尝试保存到
StringIO
或BytesIO
对象时,我会得到一个KeyError
,因为无法推断格式;提供已知格式会产生不同的错误。@FluxIX使用kwargs format='foo'避免KeyError(就像您可能做的那样)。你必须向任何人描述“不同的错误”才能帮助解决。我不是在寻求不同错误的帮助,只是将参数指定为关键字参数。@FluxIX好的,为了清楚起见,我已经包含了引用的其他答案提供的警告。我认为你的“提供一个已知的格式会产生不同的答案”意味着即使这样,解决方案仍然不适用于你。(现在我不知道该怎么想……这对您有用吗?)将参数指定为关键字参数确实有效。
hashlib.md5(img.tostring()).hexdigest()