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函数。这个函数应该释放所有分配的内存,并从外部库释放任何资源。