扩展PIL解码器
问题描述:
我有一个文件,其中包含特定格式的特定偏移量的单个图像。我已经可以获得类似于嵌入式图像 的文件,它支持read()
,seek()
和tell()
。我想利用现有PIL解码器的 来处理嵌入式图像,但是能够将整个文件视为“图像文件”。扩展PIL解码器
我一直无法弄清楚如何做到这一点给出的 documentation available,想知道如果任何人有任何见解,我怎么能 做到这一点。
答
我所做的解决这个问题的方法是从属于嵌入格式的ImageFile.ImageFile
孩子直接取代ImageFile.ImageFile
。然后在_open()
中,我将self.fp
替换为嵌入图像的文件,并调用父母的_open()
。我不能说这样做让我特别开心,但它似乎奏效了。
答
的文档的相关章节为this one,我认为这是相当明显的:例如,如果你想在新的.zap
-format的图像文件进行解码,你写一个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
属性,为了让阅读形象,也self.tile
的瓦块描述符名单再次形式(包括你说你知道的文件偏移量和解码器 - 如果本章中记录的原始或位解码器不符合你的需要,本章建议研究一些源代码许多提供的解码器,如JPEG,PNG等)。
听起来像很好的代码重用。问:你的方法是否导致新的图像类型和扩展名被注册,如果是的话,是否有什么棘手的做法呢? – martineau 2015-01-20 15:25:42
@martineau:我需要这个操作现有的二进制流,所以我没有尝试注册任何东西。具体来说,我正在阅读嵌入游戏数据文件中的PNG。 – 2015-01-20 16:04:34