Pillow 編寫圖像插件

2021-07-12 15:11 更新

Pillow 使用插件模型,允許您將自己的解碼器添加到庫中,而無需對庫本身進行任何更改。此類插件通常有這樣的名稱? XxxImagePlugin.py?,其中?Xxx?是唯一的格式名稱(通常是縮寫)。

Pillow >=2.1.0不再以? ImagePlugin.py?名稱自動導入python路徑中。您需要手動導入圖像插件。

Pillow分兩個階段解碼文件:

  1. 它以加載的順序遍歷可用的圖像插件,并?_accept?使用文件的前 16 個字節(jié)調用插件的函數(shù)。如果?_accept?函數(shù)返回 ?true?,則調用插件的?_open? 方法來設置圖像元數(shù)據(jù)和圖像圖塊。該?_open?方法不用于解碼實際圖像數(shù)據(jù)。
  2. 當請求圖像數(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 ?屬性包含一個平鋪描述符列表,而不僅僅是一個描述符。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號