阅读(2115) (0)

Pillow 用C编写文件解码器

2021-07-12 15:32:29 更新

文件解码器的生命周期有三个阶段:

  1. 设置: Pillow 在解码器注册表中查找函数,返回到名为的函数​ [decodername]_decoder ​在内部核心图像对象上。该函数是用来自​tile​设置的​args​元组在​_open​方法中调用的。
  2. 解码:解码器的解码功能通过图像数据块重复调用。
  3. 清除:如果解码器注册了清除函数,则在解码过程结束时将调用该函数,即使出现了异常。

安装程序

当前的惯例是在 ​decode.c​定义解码器设置函数的名称 ​PyImaging_[Decodername]DecoderNew​ 。它的 python 绑定被命名[decodername]_decoder并从_imaging.c函数数组的编解码器部分的文件中设置。

setup 函数需要调用PyImaging_DecoderNew并至少设置decode函数指针。此对象中感兴趣的字段是:

decode

指向解码函数的函数指针,该函数可以访问 im , state 以及要添加到图像中的数据缓冲区。

cleanup

指向清除函数的函数指针,可以访问 state .

im

目标图像,将由Pillow设置。

state

一个​ImagingCodeStateInstance​,将由Pillow设置。这个 context 成员是一个不透明结构,解码器可以使用它来存储任何特定于格式的状态或选项。

pulls_fd

实验-警告, 接口可能会改变。如果设置为1, state->fd 将是指向类似于python文件的对象的指针。解码器可以使用 codec_fd.c 直接从类似对象的文件中读取,而不是将数据推送到缓冲区中。请注意,在删除此警告之前,可能会重构此实现。

3.3.0 新版功能.

解码

使用目标(核心)图像、解码器状态结构和要解码的数据缓冲区调用解码函数。

​​实验​​- 如果​pulls_fd​设置,则解码函数被调用一次,缓冲区为空。在一次调用中解码整个图块是解码器的责任。本节的其余部分仅在​pulls_fd​未设置时适用。

解码器有责任从缓冲区中提取尽可能多的数据并返回消耗的字节数。对解码器的下一次调用将包括之前未使用的尾部。当从文件中读取数据时,解码器函数将被多次调用。

如果发生错误,设置​state->errcode​并返回-1。

成功返回 -1,不设置错误代码。

清理

如果解码器返回负值或文件中存在读取错误,则调用​cleanup​函数。这个函数应该释放所有分配的内存,并从外部库释放任何资源。