Python 如何通过EXIF/JFIF签名检测JPEG文件?
几天前,我和一位朋友(@emcconville)帮我编写了一个脚本,用于“在单个文件中恢复每个JPEG文件”。 现在我意识到这个程序只能处理标准“JFIF”的图像,不能检索标准“EXIF”的图像(数码相机拍摄的图像) 如何更改程序,使其也可以在图像中了解Exif标准? 我不熟悉Python,也不知道它的威力 谢谢Python 如何通过EXIF/JFIF签名检测JPEG文件?,python,exif,jfif,Python,Exif,Jfif,几天前,我和一位朋友(@emcconville)帮我编写了一个脚本,用于“在单个文件中恢复每个JPEG文件”。 现在我意识到这个程序只能处理标准“JFIF”的图像,不能检索标准“EXIF”的图像(数码相机拍摄的图像) 如何更改程序,使其也可以在图像中了解Exif标准? 我不熟悉Python,也不知道它的威力 谢谢 import struct with open('src.bin', 'rb') as f: # Calculate file size. f.seek(0, 2)
import struct
with open('src.bin', 'rb') as f:
# Calculate file size.
f.seek(0, 2)
total_bytes = f.tell()
# Rewind to beging.
f.seek(0)
file_cursor = f.tell()
image_cursor = 0
while file_cursor < total_bytes:
# Can for start of JPEG.
if f.read(1) == b"\xFF":
if f.read(3) == b"\xD8\xFF\xE0":
print("JPEG FOUND!")
# Backup and find the size of the image
f.seek(-8, 1)
payload_size = struct.unpack('<I', f.read(4))[0]
# Write image to disk
d_filename = 'image{0}.jpeg'.format(image_cursor)
with open(d_filename, 'wb') as d:
d.write(f.read(payload_size))
image_cursor += 1
file_cursor = f.tell()
导入结构
以open('src.bin','rb')作为f:
#计算文件大小。
f、 寻找(0,2)
总字节数=f.tell()
#倒带到beging。
f、 搜索(0)
文件\u cursor=f.tell()
图像\光标=0
当文件\u游标<总字节数时:
#可以从JPEG开始。
如果f.read(1)=b“\xFF”:
如果f.read(3)=b“\xD8\xFF\xE0”:
打印(“找到JPEG!”)
#备份并查找映像的大小
f、 搜索(-8,1)
有效载荷大小=解包结构('
EXIF文件的标记为0xffe1,JFIF文件的标记为
0xffe0。因此,所有依赖0xffe0检测JPEG文件的代码都将
丢失所有EXIF文件
所以只要改变
if f.read(3) == b"\xD8\xFF\xE0":
到
如果您想同时检查这两种情况,请不要再像这样使用.read()
,而是使用
x = f.read(3)
if x in (b"\xD8\xFF\xE0", b"\xD8\xFF\xE1"):
EXIF文件的标记为0xffe1,JFIF文件的标记为
0xffe0。因此,所有依赖0xffe0检测JPEG文件的代码都将
丢失所有EXIF文件
所以只要改变
if f.read(3) == b"\xD8\xFF\xE0":
到
如果您想同时检查这两种情况,请不要再像这样使用.read()
,而是使用
x = f.read(3)
if x in (b"\xD8\xFF\xE0", b"\xD8\xFF\xE1"):
谢谢,它工作起来很有魅力。但是如果我在“if f.read(3)”中使用“or”让程序从文件中恢复JFIF和EXIF图像,它会失败!为什么它不能这样做?因为f.read()
实际上是在标记所在的位置从文件中读取数据。每次读取后,标记将移动三个字节。如果您使用的是一个。读取(3)
操作读取标记被移动,您不再处于正确的位置。请改用我上面添加的东西。我犯了一个多么可笑的错误!您是对的。多谢了,这就像一个符咒。但是如果我使用“或”in“if f.read(3)”要让程序从文件中恢复JFIF和EXIF图像,它将失败!为什么它不能这样做?因为f.read()
实际上是在标记所在的位置从文件中读取数据。每次读取后,标记都会移动三个字节。如果您使用的是。read(3)
操作读取标记被移动,您不再处于正确位置。请改用我上面添加的内容。我犯了一个多么可笑的错误!您是对的。非常感谢