Python 使用pillow 操作圖像


文檔:https://pillow.readthedocs.io/en/stable/index.html

計算機圖像基礎

顏色和RGBA值

計算機程序通常將圖像中的顏色表示為 RGBA 值。RGBA 值是一組數字,指定顔色中的紅、綠、藍和 alpha(透明度)的值。這些值是從 0(根本沒有)到 255(最高)的整數。

這些 RGBA 值分配給單個像素,像素是計算機屏幕上能顯示一種顔色的最小點(你可以想到,屏幕上有幾百萬像素)。像素的 RGB 設置准確地告訴它應該顯示哪種顏色的色彩。

圖像也有一個 alpha 值,用於生成 RGBA 值。如果圖像顯示在屏幕上,遮住了背景圖像或桌面牆紙,alpha 值決定了“透過”這個圖像的象素,你可以看到多少背景。

在 Pillow 中,RGBA 值表示為四個整數值的元組。例如,紅色表示為(255,0,0,255)。這種顏色中紅的值為最大,沒有綠和藍,並且 alpha 值最大,這意味着它完全不透明。綠色表示為(0,255,0,255),藍色是(0,0,255,255)。白色是各種顏色的組合,即(255,255,255,255),而黑色沒有任何顏色,是(0,0,0,255)。

如果顏色的 alpha 值為 0,不論 RGB 值是什么,該顏色是不可見的。畢竟,不可見的紅色看起來就像不可見的黑色一樣。

Pillow 使用了 HTML 使用的標准顏色名稱。下面列出了一些標准顏色的名稱和值。
enter description here

Pillow 提供 ImageColor.getcolor()函數,所以你不必記住想用的顔色的 RGBA 值。該函數接受一個顏色名稱字符串作為第一個參數,字符串'RGBA'作為第二個參數,返回一個 RGBA 元組。

坐標和 Box 元組

圖像像素用 x 和 y 坐標指定,分別指定像素在圖像中的水平和垂直位置。原點是位於圖像左上角的像素,用符號(0,0)指定。第一個 0 表示 x 坐標,它以原點處為 0,從左至右增加。第二個 0 表示 y 坐標,它以原點處為 0,從上至下增加。

這值得重復一下:y 坐標向下走增加,你可能還記得數學課上使用的 y 坐標,與此相反。
enter description here

許多 Pillow 函數和方法需要一個矩形元組參數。這意味着 Pillow 需要一個四個整坐標的元組,表示圖像中的一個矩形區域。四個整數按順序分別是:

  • 左:該矩形的最左邊的 x 坐標
  • 頂:該矩形的頂邊的 y 坐標
  • 右:該矩形的最右邊右面一個像素的 x 坐標。此整數必須比左邊整數大
  • 底:該矩形的底邊下面一個像素的 y 坐標。此整數必須比頂邊整數大

注意:該矩形包括左和頂坐標,直到但不包括右和底坐標

用 Pillow 操作圖像

加載圖像

要加載圖像,就從 Pillow 導入 Image 模塊,並調用 Image.open(),傳入圖像的文件名。

Pillow 的模塊名稱是PIL,這保持與老模塊Python Imaging Library 向后兼容,這就是為什么必須 from PIL importImage,而不是 from Pillow import Image。由於Pillow 的創建者設計Pillow 模塊的方式,你必須使用from PIL import Image 形式的 import 語句,而不是簡單地 import PIL。

Image.open()函數的返回值是 Image 對象數據類型,它是 Pillow 將圖像表示為Python 值的方法。可以調用 Image.open(),傳入文件名字符串,從一個圖像文件(任何格式)加載一個 Image 對象。通過 save()方法,對 Image 對象的所有更改都可以保存到圖像文件中(也是任何格式)。所有的旋轉、調整大小、裁剪、繪畫和其他圖像操作,都通過這個 Image 對象上的方法調用來完成。

from PIL import Image
catIm = Image.open('a.png')

將新圖像進行保存:save()

Pillow 還提供了 Image.new()函數,它返回一個 Image 對象。這很像 Image.open(),不過 Image.new()返回的對象表示空白的圖像。Image.new()的參數如下:

  • 字符串'RGBA',將顏色模式設置為 RGBA(還有其他模式,但本書沒有涉及)。
  • 大小,是兩個整數元組,作為新圖像的寬度和高度。
  • 圖像開始采用的背景顏色,是一個表示 RGBA 值的四整數元組。你可以用ImageColor.getcolor()函數的返回值作為這個參數。另外,Image.new()也支持傳入標准顏色名稱的字符串。

處理 Image 數據類型

Image 對象有一些有用的屬性,提供了加載的圖像文件的基本信息:它的寬度和高度、文件名和圖像格式(如 JPEG、GIF 或 PNG)。

讀取進來的catIm的屬性:

  • size:返回一個元組,存放圖片的寬高像素數
  • filename:原始文件的名稱
  • format:原始圖片的格式
  • format_description:原始圖片的格式(詳細)

裁剪圖片

裁剪圖像是指在圖像內選擇一個矩形區域,並刪除矩形之外的一切。

Image 對象的 crop()方法接受一個矩形元組,返回一個 Image 對象,表示裁剪后的圖像。裁剪不是在原圖上發生的,也就是說,原始的 Image 對象原封不動,crop()方法返回一個新的 Image 對象。

矩形元組(這里就是要裁剪的區域)包括左列和頂行的像素,直至但不包括右列和底行的像素。

復制和粘貼圖像到其他圖像

copy()方法返回一個新的 Image 對象,它和原來的 Image 對象具有一樣的圖像。如果需要修改圖像,同時也希望保持原有的版本不變,這非常有用。

paste()方法在 Image 對象調用,將另一個圖像粘貼在它上面。

盡管名稱是 copy()和 paste(),但 Pillow 中的方法不使用計算機的剪貼板

注意:paste()方法在原圖上修改它的 Image 對象,它不會返回粘貼后圖像的Image 對象。如果想調用 paste(),但還要保持原始圖像的未修改版本,就需要先復制圖像,然后在副本上調用 paste()。

調整圖像大小

resize()方法在 Image 對象上調用,返回指定寬度和高度的一個新 Image 對象。
它接受兩個整數的元組作為參數,表示返回圖像的新高度和寬度。

resize()方法不會在原圖上修改Image 對象,而是返回一個新的Image 對象。

旋轉和翻轉圖像

圖像可以用 rotate()方法旋轉,該方法返回旋轉后的新 Image 對象,並保持原始Image 對象不變。rotate()的參數是一個整數或浮點數,表示圖像逆時針旋轉的度數。

當圖像旋轉 90 度或 270 度時,寬度和高度會變化。如果旋轉其他角度,圖像的原始尺寸會保持。在 Windows 上,使用黑色的背景來填補旋轉造成的縫隙,如圖 17-8 所示。在 OS X 上,使用透明的像素來填補縫隙。rotate()方法有一個可選的 expand 關鍵字參數,如果設置為 True,就會放大圖像的尺寸,以適應整個旋轉后的新圖像。

利用 transpose()方法,還可以得到圖像的“鏡像翻轉”。必須向 transpose()方法傳入 Image.FLIP_LEFT_RIGHT 或 Image.FLIP_TOP_BOTTOM。

像 rotate()一樣,transpose()會創建一個新 Image 對象。

更改單個像素

單個像素的顏色可以通過getpixel()和putpixel()方法取得和設置。它們都接受一個元組,表示像素的 x 和 y 坐標。putpixel()方法還接受一個元組,作為該像素的顏色。這個顔色參數是四整數RGBA 元組或三整數RGB 元組。

在圖像上繪畫

如果需要在圖像上畫線、矩形、圓形或其他簡單形狀,就用Pillow的ImageDraw模塊。

from PIL import Image, ImageDraw
im = Image.new('RGBA', (200, 200), 'white')
draw = ImageDraw.Draw(im)

首先,我們導入 Image 和 ImageDraw。然后,創建一個新的圖像,在這個例子中,是 200×200 的白色圖像,將這個 Image 對象保存在 Im 中。我們將該 Image 對象傳入 ImageDraw.Draw()函數,得到一個 ImageDraw 對象。這個對象有一些方法,可以在 Image 對象上繪制形狀和文字。將 ImageDraw 對象保存在變量 draw 中,這樣就能在接下來的例子中方便地使用它。

繪制形狀

下面的 ImageDraw 方法在圖像上繪制各種形狀。這些方法的 fill 和 outline 參數是可選的,如果未指定,默認為白色。

point(xy, fill)方法繪制單個像素。xy 參數表示要畫的點的列表。該列表可以是 x和 y 坐標的元組的列表,例如[(x, y), (x, y), ...],或是沒有元組的 x 和 y 坐標的列表,例如[x1, y1, x2, y2, ...]。fill 參數是點的顏色,要么是一個 RGBA 元組,要么是顏色名稱的字符串,如'red'。fill 參數是可選的。

line(xy, fill, width)方法繪制一條線或一系列的線。xy 要么是一個元組的列表,例如[(x, y), (x, y), ...],要么是一個整數列表,例如[x1, y1, x2, y2, ...]。每個點都是正在繪制的線上的一個連接點。可選的 fill 參數是線的顏色,是一個 RGBA 元組或顏色名稱。可選的 width 參數是線的寬度,如果未指定,缺省值為1。

矩形

rectangle(xy, fill, outline)方法繪制一個矩形。xy 參數是一個矩形元組,形式為(left,top, right, bottom)。left 和 top 值指定了矩形左上角的x 和 y 坐標,right 和bottom 指定了矩形的右下角。可選的 fill 參數是顏色,將填充該矩形的內部。可選的 outline 參數是矩形輪廓的顏色。

橢圓

ellipse(xy, fill, outline)方法繪制一個橢圓。如果橢圓的寬度和高度一樣,該方法將繪制一個圓。xy 參數是一個矩形元組(left, top, right, bottom),它表示正好包含該橢圓的矩形。可選的fill 參數是橢圓內的顏色,可選的outline 參數是橢圓輪廓的顏色。

多邊形

polygon(xy, fill, outline)方法繪制任意的多邊形。xy 參數是一個元組列表,例如[(x, y), (x, y), ...],或者是一個整數列表,例如[x1, y1, x2, y2, ...],表示多邊形邊的連接點。最后一對坐標將自動連接到第一對坐標。可選的 fill 參數是多邊形內部的顏色,可選的 outline 參數是多邊形輪廓的顏色。

繪制文本

ImageDraw 對象還有 text()方法,用於在圖像上繪制文本:

  • xy 參數是兩個整數的元組,指定文本區域的左上角。
  • text 參數是想寫入的文本字符串。
  • 可選參數 fill 是文本的顏色。
  • 可選參數 font 是一個 ImageFont 對象,用於設置文本的字體和大小。

因為通常很難預先知道一塊文本在給定的字體下的大小,所以 ImageDraw 模塊也提供了 textsize() 方法。它的第一個參數是要測量的文本字符串,第二個參數是可選的 ImageFont 對象。textsize() 方法返回一個兩整數元組,表示如果以指定的字體寫入圖像,文本的寬度和高度。可以利用這個寬度和高度,幫助你精確計算文本放在圖像上的位置。

text()的前三個參數非常簡單。在用 text()向圖像繪制文本之前,讓我們來看看可選的第四個參數,即 ImageFont 對象。

text()和 textsize()都接受可選的 ImageFont 對象,作為最后一個參數。要使用的話:from PIL import ImageFont

導入Pillow 的 ImageFont 模塊,就可以調用 ImageFont.truetype()函數,它有兩個參數。第一個參數是字符串,表示字體的TrueType 文件,這是硬盤上實際的字體文件。TrueType 字體文件具有.TTF 文件擴展名,通常可以在以下文件夾中找到:

  • 在 Windows 上:C:\Windows\Fonts。
  • 在 OS X 上:/Library/Fonts and /System/Library/Fonts。
  • 在 Linux 上:/usr/share/fonts/truetype。

ImageFont.truetype()的第二個參數是一個整數,表示字體大小的點數(而不是像素)。請記住,Pillow 創建的PNG 圖像默認是每英寸 72 像素,一點是1/72 英寸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM