我正在编写一个脚本来计算不包括EXIF标记的图像的MD5和。
为了准确地做到这一点,我需要知道EXIF标记在文件中的位置(开始、中间、结束),以便我可以排除它。
如何确定标记在文件中的位置?
我正在扫描的图像格式是TIFF、JPG、PNG、BMP、DNG、CR2、NEF,以及一些视频MOV、AVI和MPG。
发布于 2012-04-09 23:01:49
一种简单的方法是对核心图像数据进行散列。对于PNG,您可以通过只计算“关键块”(即以大写字母开头的块)来实现这一点。JPEG具有类似但更简单的文件结构。
ImageMagick中的可视散列在对图像进行散列时对其进行解压缩。在您的情况下,您可以立即散列压缩的图像数据,因此(如果实现正确)它应该和散列原始文件一样快。
这是一个很小的Python脚本,用来说明这个想法。它可能对您起作用,也可能不起作用,但至少应该给出我的意思的一个指示:)
import struct
import os
import hashlib
def png(fh):
hash = hashlib.md5()
assert fh.read(8)[1:4] == "PNG"
while True:
try:
length, = struct.unpack(">i",fh.read(4))
except struct.error:
break
if fh.read(4) == "IDAT":
hash.update(fh.read(length))
fh.read(4) # CRC
else:
fh.seek(length+4,os.SEEK_CUR)
print "Hash: %r" % hash.digest()
def jpeg(fh):
hash = hashlib.md5()
assert fh.read(2) == "\xff\xd8"
while True:
marker,length = struct.unpack(">2H", fh.read(4))
assert marker & 0xff00 == 0xff00
if marker == 0xFFDA: # Start of stream
hash.update(fh.read())
break
else:
fh.seek(length-2, os.SEEK_CUR)
print "Hash: %r" % hash.digest()
if __name__ == '__main__':
png(file("sample.png"))
jpeg(file("sample.jpg"))https://stackoverflow.com/questions/10075065
复制相似问题