2010-02-13 49 views
10

我有一个文件,其中包含特定格式的特定偏移量的单个图像。我已经可以获得类似于嵌入式图像 的文件,它支持read()seek()tell()。我想利用现有PIL解码器的 来处理嵌入式图像,但是能够将整个文件视为“图像文件”。扩展PIL解码器

我一直无法弄清楚如何做到这一点给出的 documentation available,想知道如果任何人有任何见解,我怎么能 做到这一点。

回答

3

我所做的解决这个问题的方法是从属于嵌入格式的ImageFile.ImageFile孩子直接取代ImageFile.ImageFile。然后在_open()中,我将self.fp替换为嵌入图像的文件,并调用父母的_open()。我不能说这样做让我特别开心,但它似乎奏效了。

+0

听起来像很好的代码重用。问:你的方法是否导致新的图像类型和扩展名被注册,如果是的话,是否有什么棘手的做法呢? – martineau 2015-01-20 15:25:42

+0

@martineau:我需要这个操作现有的二进制流,所以我没有尝试注册任何东西。具体来说,我正在阅读嵌入游戏数据文件中的PNG。 – 2015-01-20 16:04:34

7

的文档的相关章节为this one,我认为这是相当明显的:例如,如果你想在新的.zap -format的图像文件进行解码,你写一个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等)。