Как я могу обнаружить файлы JPEG по их подписи EXIF / JFIF?
Несколько дней назад я задал вопрос в другой области, и, наконец, друг (@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()
1 ответ
Файлы EXIF имеют маркер 0xffe1, файлы JFIF имеют маркер 0xffe0. Таким образом, весь код, который использует 0xffe0 для обнаружения файла JPEG, пропустит все файлы EXIF. (отсюда)
Так что просто поменяй
if f.read(3) == b"\xD8\xFF\xE0":
в
if f.read(3) == b"\xD8\xFF\xE1":
Если вы хотите проверить оба случая, не используйте .read()
так больше. Вместо чего-то вроде
x = f.read(3)
if x in (b"\xD8\xFF\xE0", b"\xD8\xFF\xE1"):