【问题标题】:How do I implement a pure Python Pillow image plugin?如何实现纯 Python Pillow 图像插件?
【发布时间】:2020-11-26 02:31:21
【问题描述】:

我正在尝试为特殊图像格式编写编码器。我的意图是在 pure Python 中实现它作为 Pillow 的图像插件。

在其文档 (Writing Your Own Image Plugin) 中有一个条目,提供了有关如何实现解码器的一些提示。有了这些以及我在项目问题部分获得的一些帮助,我设法让解码器正常工作。

然而,他们所有的编码器都是用 C 语言编写的,甚至没有实现 ImageFile.PyEncoder 超类(所有 Python 编码器类都应该从该超类继承)。这方面的文档也很稀少。

鉴于这种情况,是否有可能让这样的编码器工作?如果是这样,我想知道要写什么方法,从哪里获取图像数据以及将编码结果写入哪里。

相关问题:

编辑 1:我不是在寻找详细的编码器实现。只是文档没有说明 Python 中的结构应该是什么。如果它可以作为工作证明,这里有一个 repo 与我迄今为止的工作。

【问题讨论】:

  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题?”与 Stack Overflow 无关。您必须诚实地尝试解决方案,然后就您的实施提出具体问题。
  • @Prune 对我来说,发帖人似乎只是在寻找一些缺少的枕头文档,也许是 PyEncoder 缺少实现的解决方法。
  • @Prune 我确实阅读了介绍。我首先问这个问题是否可以在 Python 中解决。然后只是一些关于类的结构应该是什么的提示,因为缺乏文档。指向已经实现的其他一些编码器就足够了。请查看我的编辑。
  • @MichaelButscher 其中任何一个都应该是题外话。

标签: python plugins encoding python-imaging-library


【解决方案1】:

我设法通过手动实现编码器类来使编码器工作。所需的公共方法是:

  • __init__:设置self.mode并获取编码器的参数,如果有的话;
  • (@property) pushes_fd: 就是return self._pushes_fd;
  • setimage:设置self.im(Pillow 图像对象)并获取图像大小;
  • setfd:设置self.fd(要写入的文件对象);
  • encode_to_pyfd:这是你必须写的方法。从self.im* 读取您的输入数据并将其写入self.fd
  • cleanup:执行解码器特定的清理(只需 pass 有效)。

该类还需要设置_pushes_fd = True

虽然有点麻烦,但比我预期的要容易。

*我发现直接使用list[self.im] 而不是self.im 会更好。前者允许切片和所有其他列表操作。

【讨论】:

  • 截至 2022 年 2 月,此问题已正式通过 PR#6069 解决。
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2022-08-07
  • 1970-01-01
相关资源
最近更新 更多