Я установил опцию:
Код: Выделить всё
ImageFile.LOAD_TRUNCATED_IMAGES = True
Код: Выделить всё
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]
Вопрос: то, что я здесь пытаюсь сделать, невозможно с помощью PIL?
Несколько недель назад я попробовал то же самое с файлом изображения, который сам урезал, просто вырезав из него данные с помощью редактора. Это работало для доступных пикселей. Как только он достиг пикселя, который я отрезал, программа выдала исключение (сегодня я попробую еще раз, чтобы убедиться, что я не ошибаюсь).
Если кому-то интересно, почему я это делаю: мне нужно убедиться, что изображение/изображение внутри этого образа жесткого диска находится в последовательных блоках/кластерах и не фрагментировано. Чтобы убедиться в этом, я хотел использовать сопоставление пикселей.
РЕДАКТИРОВАТЬ:
Я попробовал еще раз и вот что увидел.
- Я открыл усеченное изображение в GIMP, и оно показало мне несколько линий пикселей в верхней части, но PIL не смог хотя бы предоставить мне значения RGB эти пиксели. Он всегда возвращает (0,0,0).
- Я сделал изображение немного больше, так что нижние 4/5 изображения не были видны, но этого было достаточно, чтобы PIL показал мне доступные значения RGB. Все остальное было (0,0,0).
Подробнее здесь: https://stackoverflow.com/questions/267 ... s-with-pil