W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
Pillow 使用插件模型,允許您將自己的解碼器添加到庫中,而無需對庫本身進行任何更改。此類插件通常有這樣的名稱? XxxImagePlugin.py
?,其中?Xxx
?是唯一的格式名稱(通常是縮寫)。
Pillow >=2.1.0不再以?
ImagePlugin.py
?名稱自動導入python路徑中。您需要手動導入圖像插件。
Pillow分兩個階段解碼文件:
_accept
?使用文件的前 16 個字節(jié)調用插件的函數(shù)。如果?_accept
?函數(shù)返回 ?true
?,則調用插件的?_open
? 方法來設置圖像元數(shù)據(jù)和圖像圖塊。該?_open
?方法不用于解碼實際圖像數(shù)據(jù)。ImageFile.load
?方法被調用,該方法為每個圖塊設置一個解碼器并將數(shù)據(jù)提供給它。圖像插件應包含從?PIL.ImageFile.ImageFile
?基類派生的格式處理程序 。這個類應該提供一個_open
方法,它讀取文件頭并至少設置?mode
?和 size
屬性。為了能夠加載文件,該方法還必須創(chuàng)建一個tile
描述符列表,其中包含解碼器名稱、圖塊的范圍和任何特定于解碼器的數(shù)據(jù)。格式處理程序類必須通過調用Image
模塊顯式注冊。
出于性能原因, ?_open
?方法必須快速拒絕沒有適當內容的文件。
下面的插件支持一個簡單的格式,它有一個128字節(jié)的標題,由單詞“SPAM”組成,后跟寬度、高度和像素大小(以位為單位)。標題字段用空格隔開。圖像數(shù)據(jù)緊跟在標題之后,可以是二級、灰度或24位真彩色。
spamimageplugin.py:
from PIL import Image, ImageFile
def _accept(prefix):
return prefix[:4] == b"SPAM"
class SpamImageFile(ImageFile.ImageFile):
format = "SPAM"
format_description = "Spam raster image"
def _open(self):
header = self.fp.read(128).split()
# size in pixels (width, height)
self._size = int(header[1]), int(header[2])
# mode setting
bits = int(header[3])
if bits == 1:
self.mode = "1"
elif bits == 8:
self.mode = "L"
elif bits == 24:
self.mode = "RGB"
else:
raise SyntaxError("unknown number of bits")
# data descriptor
self.tile = [("raw", (0, 0) + self.size, 128, (self.mode, 0, 1))]
Image.register_open(SpamImageFile.format, SpamImageFile, _accept)
Image.register_extensions(SpamImageFile.format, [
".spam",
".spa", # DOS version
])
格式處理程序必須始終設置 ?size
?和 ?mode
?屬性。如果未設置,則無法打開文件。為了簡化插件,調用代碼考慮異常,例如 ?SyntaxError
?, ?KeyError
? , ?IndexError
?, ?EOFError
?和 ?
struct.error
? 無法識別文件。
請注意,必須使用? PIL.Image.register_open()
?. 盡管不是必需的,但最好注冊此格式使用的任何擴展名。
導入插件后,就可以使用了:
from PIL import Image
import SpamImagePlugin
with Image.open("hopper.spam") as im:
pass
tile
? 屬性為了能夠讀取該文件以及識別它, ?tile
?還必須設置屬性。這個屬性包含一個平鋪描述符列表,其中每個描述符指定如何將數(shù)據(jù)加載到圖像中的給定區(qū)域。在大多數(shù)情況下,只使用一個描述符,覆蓋整個圖像。
tile描述符是一個包含以下內容的4元組:
(decoder, region, offset, parameters)
字段使用如下:
decoder
? 指定要使用的解碼器。這個 ?raw
?這里使用的解碼器支持各種像素格式的未壓縮數(shù)據(jù)。有關此解碼器的詳細信息,請參閱下面的說明。region
? 一個4元組,指定在映像中存儲數(shù)據(jù)的位置。offset
? 從文件開頭到圖像數(shù)據(jù)的字節(jié)偏移量。parameters
? 解碼器的參數(shù)。此字段的內容取決于平鋪描述符元組中第一個字段指定的解碼器。如果解碼器不需要任何參數(shù),請用?None
?于此字段。請注意 ?tile
?屬性包含一個平鋪描述符列表,而不僅僅是一個描述符。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: