Pillow 用C编写文件解码器
文件解码器的生命周期有三个阶段:
- 设置: Pillow 在解码器注册表中查找函数,返回到名为的函数
[decodername]_decoder
在内部核心图像对象上。该函数是用来自tile
设置的args
元组在_open
方法中调用的。 - 解码:解码器的解码功能通过图像数据块重复调用。
- 清除:如果解码器注册了清除函数,则在解码过程结束时将调用该函数,即使出现了异常。
安装程序
当前的惯例是在 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
函数。这个函数应该释放所有分配的内存,并从外部库释放任何资源。
更多建议: