我怎样才能得到md5的pil对象而不保存到文件?md5从pil对象
imq.save('out.png')
hash = hashlib.md5(open('out.png','rb').read()).hexdigest()
我怎样才能得到md5的pil对象而不保存到文件?md5从pil对象
imq.save('out.png')
hash = hashlib.md5(open('out.png','rb').read()).hexdigest()
您可以改为将它写入StringIO
,然后取其中的散列。
您可以使用以下PIL Image
类方法来获取原始图像数据以提供给md5()
。
im.getdata()=>序列
返回一个图像的内容为包含像素 值的 序列对象。序列对象为 变平,以便第一行 的值紧跟在 行的值之后,依此类推。
注意,使用本不会的所得MD5哈希是相同的示例代码,因为它是(至少部分地)独立于用于保存图像的特定的图像文件格式的。如果要比较实际图像而不考虑可能保存的特定图像文件格式,该功能可能很有用。
要使用它,您需要将图像数据的MD5哈希存储在某个地方,而不管任何图像文件它可以在需要时进行检索 - 而不是通过将整个文件作为二进制数据读入内存来生成,就像问题中的代码一样。相反,您需要始终将映像加载到PIL中,然后使用其上的方法来计算散列。
谈到@伊格纳西奥的回答为代码,使用this answer帮助:
import StringIO, hashlib
output = StringIO.StringIO()
img.save(output)
hash = hashlib.md5(output.getvalue()).hexdigest()
由于引用的其他答案指出,如果PIL尝试自动检测输出格式这可能会导致一个KeyError异常。为了避免这个问题,你可以手动指定格式:
img.save(output, format='GIF')
(注:我用“IMG”作为变量,而不是我认为是一个错字你“IMQ”)
其实有更简单的解决方案:
hashlib.md5(img.tostring()).hexdigest()
当我尝试保存到任何一个`StringIO`或`BytesIO`对象,我得到一个'KeyError`因为格式无法推断;提供已知格式会产生不同的错误。 – FluxIX 2017-04-04 15:24:48
@FluxIX避免使用kwargs format ='foo'的KeyError(正如你可能做的那样)。你必须描述任何人提供的“不同的错误”。 – 2017-04-04 16:36:12