Работа с усеченными изображениями с помощью PILPython

Программы на Python
Ответить
Anonymous
 Работа с усеченными изображениями с помощью PIL

Сообщение Anonymous »

Я пытаюсь заставить библиотеку PIL Python 2.7 работать с изображениями JPEG, которые доступны только в виде потока, исходящего из образа жесткого диска, и не являются полными.

Я установил опцию:

Код: Выделить всё

ImageFile.LOAD_TRUNCATED_IMAGES = True
И загружаем поток настолько, насколько он доступен (или лучше сказать: насколько я на 100% уверен, что эти данные по-прежнему являются изображением, а не каким-то другим типом файла). Я тестировал разные вещи, и, насколько я могу судить (для JPEG), PIL принимает его как действительное изображение JPEG только в том случае, если находит 0xFFDA (маркер начала сканирования). Это краткий пример того, как я загружаю данные:

Код: Выделить всё

from PIL import Image
from StringIO import StringIO

ImageFile.LOAD_TRUNCATED_IMAGES = True

with open("/path/to/image.raw", 'rb') as fp:
fp.seek("""jump to position in image where JPEG starts""")
data = fp.read("""number of bytes I know that those belong to that jpeg""")
img = Image.open(StringIO(data)) # This would throw exception if the data does
# not contain the 0xffda marker
pixel = img.load()               # Would throw exception if LOAD_TRUNCATED_IMAGES = false

height,width = img.size
for i in range(height):
for j in range(width):
print pixel[i,j]
В самой последней строке я ожидал (или надеялся) увидеть по крайней мере прочитанные пиксельные данные, которые будут отображаться. Но для каждого пикселя он возвращает (0,0,0).

Вопрос: То, что я здесь пытаюсь сделать, невозможно с помощью PIL?

Несколько недель назад я попробовал то же самое с файлом изображения, который я усек сам, просто вырезав из него данные с помощью редактора. Это работало для доступных пикселей. Как только он достиг пикселя, который я обрезал, программа выдала исключение (сегодня я попробую еще раз, чтобы убедиться, что я не ошибаюсь).

Если кому-то интересно, почему я это делаю: мне нужно убедиться, что изображение/изображение внутри этого образа жесткого диска находится в последовательных блоках/кластерах и не фрагментировано. Чтобы убедиться в этом, я хотел использовать сопоставление пикселей.

РЕДАКТИРОВАНИЕ:
Я попробовал это еще раз, и вот что я увидел.
  • Я открыл усеченное изображение в GIMP, и оно показало мне несколько линий пикселей в верхней части, но PIL не смог хотя бы дать мне значения RGB для этих пикселей. Он всегда возвращает (0,0,0).
  • Я сделал изображение немного больше, так что нижние 4/5 изображения не были видны, но этого было достаточно, чтобы PIL показал мне доступные значения RGB. Все остальное было (0,0,0).
Я до сих пор не уверен на 100 %, сможет ли PIL показать мне значения RGB, даже если доступны только пиксельные данные просмотра.

Подробнее здесь: https://stackoverflow.com/questions/267 ... s-with-pil
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»