我有一个文件,其中包含特定格式、特定偏移量的单个图像。我已经可以为内嵌图像获取类似文件的东西,它支持read()
,seek()
和tell()
方法。我想利用现有的PIL解码器来处理内嵌图像,但同时又能够将整个文件视为一个“图像文件”。
根据文档中提供的信息,我还没有找到如何实现这一点,想知道是否有任何见解可供参考。
我有一个文件,其中包含特定格式、特定偏移量的单个图像。我已经可以为内嵌图像获取类似文件的东西,它支持read()
,seek()
和tell()
方法。我想利用现有的PIL解码器来处理内嵌图像,但同时又能够将整个文件视为一个“图像文件”。
根据文档中提供的信息,我还没有找到如何实现这一点,想知道是否有任何见解可供参考。
相关文档的章节是这个,我认为很清楚:例如,如果您想要解码新的.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
属性,并且为了允许读取图像,还需要self.tile
,这是一个瓦片描述符列表,格式与该章节中指定的格式相同(包括文件偏移量,您所说的,以及一个解码器--如果原始或位解码器在该章节中记录不符合您的需求,则该章节建议研究一些许多提供的解码器的源代码,例如JPEG、PNG等)。
我为解决这个问题所做的是继承嵌入格式的ImageFile.ImageFile
子类,而不是直接继承ImageFile.ImageFile
。然后在_open()
中,我用嵌入图像的文件替换了self.fp
,并调用了父类的_open()
方法。我不能说我特别喜欢以这种方式解决它,但它似乎奏效了。