Работа с усеченными изображениями с помощью PIL ⇐ Python
Работа с усеченными изображениями с помощью PIL
Я пытаюсь заставить библиотеку PIL Python 2.7 работать с изображениями JPEG, которые доступны только в виде потока, исходящего из образа жесткого диска, и не являются полными.
Я установил эту опцию:
ImageFile.LOAD_TRUNCATED_IMAGES = True И загружаем поток настолько, насколько он доступен (или лучше сказать: насколько я на 100% уверен, что эти данные по-прежнему являются изображением, а не каким-то другим типом файла). Я тестировал разные вещи, и, насколько я могу судить (для JPEG), PIL принимает его как допустимое изображение JPEG только в том случае, если находит 0xFFDA (маркер начала сканирования). Это краткий пример того, как я загружаю данные:
из изображения импорта PIL из StringIO импортировать StringIO ImageFile.LOAD_TRUNCATED_IMAGES = Истина с open("/path/to/image.raw", 'rb') как fp: fp.seek("""перейти к месту на изображении, где начинается JPEG""") data = fp.read("""количество байтов, которые, как я знаю, принадлежат этому jpeg""") img = Image.open(StringIO(data)) # Это вызовет исключение, если данные не # не содержать маркера 0xffda Pixel = img.load() # Вызовет исключение, если LOAD_TRUNCATED_IMAGES = false высота, ширина = img.size для меня в диапазоне (высота): для j в диапазоне (ширине): напечатать пиксель[i,j] В самой последней строке я ожидал (или надеялся) увидеть по крайней мере прочитанные пиксельные данные, которые будут отображаться. Но для каждого пикселя он возвращает (0,0,0).
Вопрос: то, что я здесь пытаюсь сделать, невозможно с помощью PIL?
Несколько недель назад я попробовал то же самое с файлом изображения, который сам урезал, просто вырезав из него данные в редакторе. Это работало для доступных пикселей. Как только он достиг пикселя, который я обрезал, программа выдала исключение (сегодня я попробую еще раз, чтобы убедиться, что я не ошибаюсь).
Если кому-то интересно, почему я это делаю: мне нужно убедиться, что изображение/изображение внутри этого образа жесткого диска находится в последовательных блоках/кластерах и не фрагментировано. Чтобы убедиться в этом, я хотел использовать сопоставление пикселей.
РЕДАКТИРОВАТЬ: Я попробовал еще раз и вот что увидел.
[*]
Я открыл усеченное изображение в GIMP, и оно показало мне несколько линий пикселей в верхней части, но PIL не смог хотя бы предоставить мне значения RGB для этих пикселей. Он всегда возвращает (0,0,0).
[*]
Я сделал изображение немного больше, так что нижние 4/5 изображения не были видны, но этого было достаточно для PIL, чтобы показать мне доступные значения RGB. Все остальное было (0,0,0).
Я до сих пор не уверен на 100 %, сможет ли PIL показать мне значения RGB, даже если доступны только данные пикселей просмотра.
Я пытаюсь заставить библиотеку PIL Python 2.7 работать с изображениями JPEG, которые доступны только в виде потока, исходящего из образа жесткого диска, и не являются полными.
Я установил эту опцию:
ImageFile.LOAD_TRUNCATED_IMAGES = True И загружаем поток настолько, насколько он доступен (или лучше сказать: насколько я на 100% уверен, что эти данные по-прежнему являются изображением, а не каким-то другим типом файла). Я тестировал разные вещи, и, насколько я могу судить (для JPEG), PIL принимает его как допустимое изображение JPEG только в том случае, если находит 0xFFDA (маркер начала сканирования). Это краткий пример того, как я загружаю данные:
из изображения импорта PIL из StringIO импортировать StringIO ImageFile.LOAD_TRUNCATED_IMAGES = Истина с open("/path/to/image.raw", 'rb') как fp: fp.seek("""перейти к месту на изображении, где начинается JPEG""") data = fp.read("""количество байтов, которые, как я знаю, принадлежат этому jpeg""") img = Image.open(StringIO(data)) # Это вызовет исключение, если данные не # не содержать маркера 0xffda Pixel = img.load() # Вызовет исключение, если LOAD_TRUNCATED_IMAGES = false высота, ширина = img.size для меня в диапазоне (высота): для j в диапазоне (ширине): напечатать пиксель[i,j] В самой последней строке я ожидал (или надеялся) увидеть по крайней мере прочитанные пиксельные данные, которые будут отображаться. Но для каждого пикселя он возвращает (0,0,0).
Вопрос: то, что я здесь пытаюсь сделать, невозможно с помощью PIL?
Несколько недель назад я попробовал то же самое с файлом изображения, который сам урезал, просто вырезав из него данные в редакторе. Это работало для доступных пикселей. Как только он достиг пикселя, который я обрезал, программа выдала исключение (сегодня я попробую еще раз, чтобы убедиться, что я не ошибаюсь).
Если кому-то интересно, почему я это делаю: мне нужно убедиться, что изображение/изображение внутри этого образа жесткого диска находится в последовательных блоках/кластерах и не фрагментировано. Чтобы убедиться в этом, я хотел использовать сопоставление пикселей.
РЕДАКТИРОВАТЬ: Я попробовал еще раз и вот что увидел.
[*]
Я открыл усеченное изображение в GIMP, и оно показало мне несколько линий пикселей в верхней части, но PIL не смог хотя бы предоставить мне значения RGB для этих пикселей. Он всегда возвращает (0,0,0).
[*]
Я сделал изображение немного больше, так что нижние 4/5 изображения не были видны, но этого было достаточно для PIL, чтобы показать мне доступные значения RGB. Все остальное было (0,0,0).
Я до сих пор не уверен на 100 %, сможет ли PIL показать мне значения RGB, даже если доступны только данные пикселей просмотра.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Средняя разница в квадратах между двумя изображениями, используя Python и PIL
Anonymous » » в форуме Python - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Средняя разница в квадратах между двумя изображениями, используя Python и PIL
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-