问题 扩展PIL解码器


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

鉴于此,我无法弄清楚如何做到这一点 文件 可得到 并且想知道是否有人对我的能力有任何见解 做这个。


11374
2018-02-13 11:33


起源



答案:


文档的相关章节是 这个 而且我认为这很清楚:例如,你想要解码新的图像文件 .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等)。


7
2018-02-13 16:18





我为解决这个问题所做的就是从中得到 ImageFile.ImageFile 属于嵌入格式的子代替 ImageFile.ImageFile 直。然后在 _open() 我换了 self.fp 与文件类似的嵌入式图像,并称为父级 _open()。我不能说我特别高兴这样做,但它似乎有效。


3
2018-02-13 20:47



听起来很好的代码重用。问:您的方法是否导致新的图像类型和扩展名被注册,如果是这样,有什么棘手的做法吗? - martineau
@martineau:我需要这个来操作现有的二进制流,所以我没有尝试注册任何东西。具体来说,我正在阅读嵌入游戏数据文件中的PNG。 - Ignacio Vazquez-Abrams


答案:


文档的相关章节是 这个 而且我认为这很清楚:例如,你想要解码新的图像文件 .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等)。


7
2018-02-13 16:18





我为解决这个问题所做的就是从中得到 ImageFile.ImageFile 属于嵌入格式的子代替 ImageFile.ImageFile 直。然后在 _open() 我换了 self.fp 与文件类似的嵌入式图像,并称为父级 _open()。我不能说我特别高兴这样做,但它似乎有效。


3
2018-02-13 20:47



听起来很好的代码重用。问:您的方法是否导致新的图像类型和扩展名被注册,如果是这样,有什么棘手的做法吗? - martineau
@martineau:我需要这个来操作现有的二进制流,所以我没有尝试注册任何东西。具体来说,我正在阅读嵌入游戏数据文件中的PNG。 - Ignacio Vazquez-Abrams