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