概念

Python 圖像函式庫處理點陣圖像;也就是像素資料的矩形。

頻帶

一個圖像可以由一個或多個資料頻帶組成。Python 圖像函式庫允許您在單一圖像中儲存多個頻帶,前提是它們都具有相同的尺寸和深度。例如,PNG 圖像可能具有「R」、「G」、「B」和「A」頻帶,分別對應紅色、綠色、藍色和 Alpha 透明度值。許多操作會分別對每個頻帶執行,例如直方圖。通常將每個像素視為每個頻帶都有一個值會很有用。

要取得圖像中頻帶的數量和名稱,請使用 getbands() 方法。

模式

圖像的 mode 是一個字串,用於定義圖像中像素的類型和深度。每個像素都會使用位元深度的完整範圍。因此,1 位元像素的範圍為 0-1,8 位元像素的範圍為 0-255,32 位元帶符號整數像素的範圍為 INT32,而 32 位元浮點像素的範圍為 FLOAT32。目前版本支援以下標準模式

  • 1 (1 位元像素,黑白,每個位元組儲存一個像素)

  • L (8 位元像素,灰階)

  • P (8 位元像素,使用色彩調色盤對應到任何其他模式)

  • RGB (3x8 位元像素,真彩色)

  • RGBA (4x8 位元像素,具有透明遮罩的真彩色)

  • CMYK (4x8 位元像素,分色)

  • YCbCr (3x8 位元像素,色彩影片格式)

    • 請注意,這是指 JPEG 標準,而不是 ITU-R BT.2020 標準

  • LAB (3x8 位元像素,L*a*b 色彩空間)

  • HSV (3x8 位元像素,色相、飽和度、明度色彩空間)

    • 色相的 0-255 範圍是 0 度 <= 色相 < 360 度的縮放版本

  • I (32 位元帶符號整數像素)

  • F (32 位元浮點像素)

Pillow 也提供對一些其他模式的有限支援,包括

  • LA (L 與 Alpha)

  • PA (P 與 Alpha)

  • RGBX (具有填補的真彩色)

  • RGBa (具有預乘 Alpha 的真彩色)

  • La (L 與預乘 Alpha)

  • I;16 (16 位元無符號整數像素)

  • I;16L (16 位元小端無符號整數像素)

  • I;16B (16 位元大端無符號整數像素)

  • I;16N (16 位元原生端無符號整數像素)

預乘 Alpha 是指每個其他通道的值都已乘以 Alpha 值。例如,RGBA 像素 (10, 20, 30, 127) 將會轉換為 RGBa 像素 (5, 10, 15, 127)。R、G 和 B 通道的值會因 Alpha 通道中的半透明度而減半。

除了這些其他模式之外,Pillow 目前還不支援每個通道深度超過 8 位元的多通道圖像。

Pillow 也不支援使用者定義的模式;如果您需要處理上面未列出的頻帶組合,請使用 Image 物件的序列。

您可以透過 mode 屬性讀取圖像的模式。這是一個包含上述其中一個值的字串。

尺寸

您可以透過 size 屬性讀取圖像尺寸。這是一個 2 元組,包含水平和垂直尺寸(以像素為單位)。

座標系統

Python 圖像函式庫使用笛卡爾像素座標系統,左上角為 (0,0)。請注意,座標是指隱含的像素角;定址為 (0, 0) 的像素中心實際上位於 (0.5, 0.5)。

座標通常以 2 元組 (x, y) 的形式傳遞給函式庫。矩形則表示為 4 元組 (x1, y1, x2, y2),左上角先給定。

調色盤

調色盤模式 (P) 使用色彩調色盤來定義每個像素的實際色彩。

資訊

您可以使用 info 屬性將輔助資訊附加到圖像。這是一個字典物件。

在載入和儲存影像檔案時,如何處理這些資訊取決於檔案格式處理器(請參閱關於影像檔案格式的章節)。大多數處理器會在載入影像時將屬性新增至 info 屬性,但在儲存影像時會忽略它。

透明度

如果影像沒有 Alpha 通道,則可以在 info 屬性中使用 “transparency” 鍵來指定透明度。

大多數情況下,“transparency” 值是一個單一整數,用於描述在 “1”、“L”、“I” 或 “P” 模式影像中哪個像素值是透明的。但是,PNG 影像可能會有三個值,每個值對應 “RGB” 模式影像中的一個通道,或者對於 “P” 模式影像,可能有一個位元組字串,用於指定每個調色盤條目的 Alpha 值。

方向

JPG 和 TIFF 影像的 info 屬性中常見的元素是 EXIF 方向標籤。這是關於影像資料應如何定向的指令。例如,它可能指示影像旋轉 90 度或鏡像。若要將此資訊套用至影像,可以使用 exif_transpose()

濾鏡

對於可能將多個輸入像素對應到單個輸出像素的幾何操作,Python 影像庫提供了不同的重新取樣濾鏡

Resampling.NEAREST

從輸入影像中選取一個最近的像素。忽略所有其他輸入像素。

Resampling.BOX

來源影像的每個像素都以相同的權重貢獻到目標影像的一個像素。對於放大,它等同於 Resampling.NEAREST。此濾鏡只能與 resize()thumbnail() 方法一起使用。

在版本 3.4.0 中新增。

Resampling.BILINEAR

對於調整大小,使用線性插值計算可能貢獻於輸出值的所有像素上的輸出像素值。對於其他轉換,則使用輸入影像中 2x2 環境上的線性插值。

Resampling.HAMMING

產生比 Resampling.BILINEAR 更銳利的影像,在局部層面沒有像 Resampling.BOX 那樣的位移。此濾鏡只能與 resize()thumbnail() 方法一起使用。

在版本 3.4.0 中新增。

Resampling.BICUBIC

對於調整大小,使用三次插值計算可能貢獻於輸出值的所有像素上的輸出像素值。對於其他轉換,則使用輸入影像中 4x4 環境上的三次插值。

Resampling.LANCZOS

使用高品質的 Lanczos 濾鏡(截斷的 sinc)計算可能貢獻於輸出值的所有像素上的輸出像素值。此濾鏡只能與 resize()thumbnail() 方法一起使用。

在版本 1.1.3 中新增。

濾鏡比較表

濾鏡

縮小品質

放大品質

效能

Resampling.NEAREST

⭐⭐⭐⭐⭐

Resampling.BOX

⭐⭐⭐⭐

Resampling.BILINEAR

⭐⭐⭐

Resampling.HAMMING

⭐⭐

⭐⭐⭐

Resampling.BICUBIC

⭐⭐⭐

⭐⭐⭐

⭐⭐

Resampling.LANCZOS

⭐⭐⭐⭐

⭐⭐⭐⭐