Расширение декодера PIL - PullRequest
11 голосов
/ 13 февраля 2010

У меня есть файл, который содержит одно изображение определенного формата на конкретное смещение. Я уже могу получить файл, как для встроенного изображения который поддерживает read(), seek() и tell(). Я хочу воспользоваться существующего декодера PIL для обработки встроенного изображения, но иметь возможность обрабатывать весь файл как «файл изображения» как таковой.

Я не смог понять, как это сделать, учитывая документация доступно и было интересно, есть ли у кого-нибудь понимание того, как я мог сделай это.

Ответы [ 2 ]

7 голосов
/ 13 февраля 2010

Соответствующей главой документации является эта , и я думаю, что это довольно ясно: если, например, вы хотите декодировать файлы изображений в новом формате .zap, вы пишете модуль ZapImagePlugin.pyкоторый должен выполнить несколько вещей:

  • иметь class ZapImageFile(ImageFile.ImageFile): со строковыми атрибутами format и format_description и метод-ловушку def _open(self) (о которых более позднее);
  • на уровне модуля, Image.register_open('zap', ZapImageFile) и Image.register_extension('ZAP', '.zap')

Спецификации метода _open очень четко изложены в главе - он должен считывать данные изображения и метаданные из открытогодвоичный файлоподобный объект self.fp, поднимите SyntaxError (или другое исключение) как можно скорее, если он обнаружит, что файл на самом деле не в правильном формате, установите как минимум атрибуты self.size и self.mode, и чтобы разрешить1024 * чтение изображения, а также self.tile, список дескрипторов плиток снова в формате, указанном в этой главе (включая смещение файла, которое, как вы знаете, вы знаете, и декодер -- если исходные или битовые декодеры, описанные в главе, неВ соответствии с вашими потребностями глава рекомендует изучить источники некоторых из многих поставляемых декодеров, таких как JPEG, PNG и т. д.).

3 голосов
/ 13 февраля 2010

Что я сделал для решения этой проблемы, так это для получения от ImageFile.ImageFile потомка, принадлежащего встроенному формату, а не ImageFile.ImageFile напрямую. Затем в _open() я заменил self.fp на файл, похожий на внедренное изображение, и назвал родительский _open(). Я не могу сказать, что я особенно счастлив делать это таким образом, но, похоже, это сработало.

...