Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过EXIF/JFIF签名检测JPEG文件?_Python_Exif_Jfif - Fatal编程技术网

Python 如何通过EXIF/JFIF签名检测JPEG文件?

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)

几天前,我和一位朋友(@emcconville)帮我编写了一个脚本,用于“在单个文件中恢复每个JPEG文件”。 现在我意识到这个程序只能处理标准“JFIF”的图像,不能检索标准“EXIF”的图像(数码相机拍摄的图像)

如何更改程序,使其也可以在图像中了解Exif标准? 我不熟悉Python,也不知道它的威力

谢谢

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)
操作读取标记被移动,您不再处于正确位置。请改用我上面添加的内容。我犯了一个多么可笑的错误!您是对的。非常感谢