扩展PIL解码器

14

我有一个文件,其中包含特定格式、特定偏移量的单个图像。我已经可以为内嵌图像获取类似文件的东西,它支持read()seek()tell()方法。我想利用现有的PIL解码器来处理内嵌图像,但同时又能够将整个文件视为一个“图像文件”。

根据文档中提供的信息,我还没有找到如何实现这一点,想知道是否有任何见解可供参考。

2个回答

9

相关文档的章节是这个,我认为很清楚:例如,如果您想要解码新的.zap格式的图像文件,则需要编写一个ZapImagePlugin.py模块,其中必须执行以下几个步骤:

  • 有一个class ZapImageFile(ImageFile.ImageFile):,具有字符串属性formatformat_description,以及一个钩子方法def _open(self)(稍后会详细说明);
  • 在模块级别上,Image.register_open('zap', ZapImageFile)Image.register_extension('ZAP', '.zap')

对于_open方法的规格在该章节中非常清晰地阐述--它必须从打开的二进制文件类似对象self.fp中读取图像数据和元数据,如果检测到文件实际上不在正确的格式中,尽快引发SyntaxError(或其他异常),设置至少self.sizeself.mode属性,并且为了允许读取图像,还需要self.tile,这是一个瓦片描述符列表,格式与该章节中指定的格式相同(包括文件偏移量,您所说的,以及一个解码器--如果原始或位解码器在该章节中记录不符合您的需求,则该章节建议研究一些许多提供的解码器的源代码,例如JPEG、PNG等)。


4

我为解决这个问题所做的是继承嵌入格式的ImageFile.ImageFile子类,而不是直接继承ImageFile.ImageFile。然后在_open()中,我用嵌入图像的文件替换了self.fp,并调用了父类的_open()方法。我不能说我特别喜欢以这种方式解决它,但它似乎奏效了。


听起来像是很好的代码重用。问题:你的方法是否导致了新的图像类型和扩展名被注册,如果是的话,有没有什么棘手的地方? - martineau
@martineau:我需要对现有的二进制流进行操作,因此我没有尝试注册任何内容。具体来说,我正在读取嵌入在游戏数据文件中的PNG文件。 - Ignacio Vazquez-Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接