Pillow 用C編寫文件解碼器

2021-07-12 15:44 更新

文件解碼器的生命周期有三個階段:

  1. 設置: Pillow 在解碼器注冊表中查找函數(shù),返回到名為的函數(shù)? [decodername]_decoder ?在內(nèi)部核心圖像對象上。該函數(shù)是用來自?tile?設置的?args?元組在?_open?方法中調(diào)用的。
  2. 解碼:解碼器的解碼功能通過圖像數(shù)據(jù)塊重復調(diào)用。
  3. 清除:如果解碼器注冊了清除函數(shù),則在解碼過程結束時將調(diào)用該函數(shù),即使出現(xiàn)了異常。

安裝程序

當前的慣例是在 ?decode.c?定義解碼器設置函數(shù)的名稱 ?PyImaging_[Decodername]DecoderNew? 。它的 python 綁定被命名[decodername]_decoder并從_imaging.c函數(shù)數(shù)組的編解碼器部分的文件中設置。

setup 函數(shù)需要調(diào)用PyImaging_DecoderNew并至少設置decode函數(shù)指針。此對象中感興趣的字段是:

?decode?

指向解碼函數(shù)的函數(shù)指針,該函數(shù)可以訪問 im , state 以及要添加到圖像中的數(shù)據(jù)緩沖區(qū)。

?cleanup?

指向清除函數(shù)的函數(shù)指針,可以訪問 state .

?im?

目標圖像,將由Pillow設置。

?state?

一個?ImagingCodeStateInstance?,將由Pillow設置。這個 context 成員是一個不透明結構,解碼器可以使用它來存儲任何特定于格式的狀態(tài)或選項。

?pulls_fd?

實驗-警告, 接口可能會改變。如果設置為1, state->fd 將是指向類似于python文件的對象的指針。解碼器可以使用 codec_fd.c 直接從類似對象的文件中讀取,而不是將數(shù)據(jù)推送到緩沖區(qū)中。請注意,在刪除此警告之前,可能會重構此實現(xiàn)。

3.3.0 新版功能.

解碼

使用目標(核心)圖像、解碼器狀態(tài)結構和要解碼的數(shù)據(jù)緩沖區(qū)調(diào)用解碼函數(shù)。

??實驗??- 如果?pulls_fd?設置,則解碼函數(shù)被調(diào)用一次,緩沖區(qū)為空。在一次調(diào)用中解碼整個圖塊是解碼器的責任。本節(jié)的其余部分僅在?pulls_fd?未設置時適用。

解碼器有責任從緩沖區(qū)中提取盡可能多的數(shù)據(jù)并返回消耗的字節(jié)數(shù)。對解碼器的下一次調(diào)用將包括之前未使用的尾部。當從文件中讀取數(shù)據(jù)時,解碼器函數(shù)將被多次調(diào)用。

如果發(fā)生錯誤,設置?state->errcode?并返回-1。

成功返回 -1,不設置錯誤代碼。

清理

如果解碼器返回負值或文件中存在讀取錯誤,則調(diào)用?cleanup?函數(shù)。這個函數(shù)應該釋放所有分配的內(nèi)存,并從外部庫釋放任何資源。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號