Как проверить изображение при очистке файла пользовательских данных - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь очистить некоторые файлы изображений (gif, jpg) из существующего файла данных.Файл данных разделен на куски по 4096 байт.Изображения фрагментированы, но не используется обратная фрагментация.

У меня есть смещение изображения, файл gif89a, и я вырезал весь файл под заголовком блоками по 4096 байт.То, что я пытаюсь сделать, это назначить первый блок после стартового блока и убедиться, что эти два блока действительно последовательны и имеют «смысл», когда они расположены таким образом.Если они имеют смысл, другой блок помещается позади, если нет, предыдущий размещенный блок удаляется.

import itertools
from PIL import Image
import os

with open('project_def_stripped.data', 'rb') as data:
    data.seek(344064)
    start_block = data.read(4096)
    data.close()

i = 344064 + 4096

chunk_list = []

with open('project_def_stripped.data', 'rb') as data:
    while i < 33013744:
        data.seek(i)
        chunk = data.read(4096)
        if chunk.count(b'\x00') != 4096:
            # if chunk.count(b'\xFF') < 50:
            chunk_list.append(chunk)
        i = i + 4096

print(len(chunk_list))

i = 0
j = 0
with open('foto/testikel.jpg', 'wb') as picture:
    picture.write(start_block)
    while i < len(chunk_list):
        picture.write(chunk_list[i])
        picture.close()
        img = Image.open('foto/testikel.jpg')
        if img.verify():
            picture = open('foto/testikel.jpg', 'ab')
            i = i + 1
        else:
            picture = open('foto/testikel.jpg', 'ab')
            picture.seek(-4096, os.SEEK_END)
            picture.truncate()
            picture.seek(os.SEEK_END)
            i = i + 1
        img.close()

Теперь, похоже, проблема в том, что Image.verify () из Pillow не может проверить изображение, если данные изображения не заполнены.В других случаях он всегда возвращает false.

Есть ли другой способ проверить, что блоки, которые я размещаю за стартовым блоком, действительно являются правильными блоками?

...