如何在PIL中打开图像,然后打印图像的md5哈希值而不将其保存到文件并读取文件?
答案 0 :(得分:10)
您可以将图片保存为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
,保存为有损格式也会产生不同的数据。
答案 1 :(得分:3)
PIL/Pillow
有一个Image
方法tobytes
(旧版本中为tostring
),它会将图像像素值存储在字节字符串中。只需在返回的字节字符串上运行哈希算法。
这比编写PNG等特定格式更有效,因为它是内部使用的本机表示。
答案 2 :(得分:2)
from PIL import Image
import hashlib
md5hash = hashlib.md5(Image.open('test.png').tobytes())
print(md5hash.hexdigest())
答案 3 :(得分:1)
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())