Расширение декодера PIL

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

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

11
задан Jonathan Root 11 August 2013 в 18:11
поделиться

2 ответа

В Unix sys.stdin.isatty () достоверно сообщает, поступает ли стандартный ввод с терминального устройства (или перенаправляется иным образом), и аналогичным образом для того же метода на sys.stdout и sys.stderr , чтобы можно было использовать эти вызовы для определения того, выполняется ли приложение в интерактивном режиме или Как именно вы хотите их использовать, зависит от того, что вы хотите сделать, если (например) как стандартные входные, так и выходные данные перенаправляются на нетерминал, но стандартная ошибка идет на терминал - рассмотрим каждую из 8 возможностей, от всех из них перенаправляется на нетерминалы ни к одному из них, и решите, что вы хотите сделать в каждом случае.

В Windows ситуация отличается, поскольку выполнение файла .py (в отличие от файла .pyw ) создаст новую временную консоль (в Unix нет абсолютно эквивалентной ситуации); Полагаю, это дело, с которым вы хотите разобраться? (Или речь идет только о перенаправлении стандартных потоков ввода-вывода в файлы, что возможно в Windows примерно так же, как в Unix?). Я думаю, что лучшим подходом в Windows может быть использование win32api.SetConsoleCtrlHandler для установки обработчика для таких событий, как CTRL _ CLOSE _ EVENT - это путь, что обработчик должен быть вызван (в данном случае, когда консоль закрывается), если является консолью для процесса, но не иначе. Или, если вы заботитесь только о том, есть ли консоль вообще или нет (и предпочитайте обращаться с вещами другим способом), попробуйте вызвать win32api.GetConsureTitle в try ветви try /, за исключением - это создаст исключение (на которые вы ловите и отвечаете, устанавливая для вашей логической переменной значение False ) если нет консоли, и просто работать (в этом случае для этой логической переменной устанавливается значение True ), если является консолью.

-121--3677620-

В этом случае лучше искать недопустимые символы, чем пытаться сопоставить все символы. После появления одного недопустимого символа поиск может завершиться и вернуть ошибку. Это более эффективно, чем всегда сканирование всей последовательности.

if (preg_match("/[^A-Za-z'-]/", $First)) { die ("invalid first name"); }

^ внутри набора [] делает его соответствующим всем, не входящим в набор. и поскольку последовательность является недопустимой, если у нас есть даже один недопустимый символ, нет необходимости в том, чтобы набор имел оператор повторения.

Еще лучше было бы получить более полезное сообщение об ошибке

if (preg_match("/[^A-Za-z'-]/", $First, $Inv)) { die ("{$Inv[0]} not allowed in first name"); }
-121--2910285-

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

3
ответ дан 3 December 2019 в 10:03
поделиться

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

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

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

7
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: