1. 程式人生 > >Python影象處理庫PIL的ImageDraw模組介紹

Python影象處理庫PIL的ImageDraw模組介紹

ImageDraw模組提供了影象物件的簡單2D繪製。使用者可以使用這個模組建立新的影象,註釋或潤飾已存在影象,為web應用實時產生各種圖形。

一、ImageDraw模組的概念

1、  Coordinates

繪圖介面使用和PIL一樣的座標系統,即(00)為左上角。

2、  Colours

為了指定顏色,使用者可以使用數字或者元組,對應使用者使用函式Image.new或者Image.putpixel。對於模式為“1”,“L”和“I”的影象,使用整數。對於“RGB”影象,使用整陣列成的3元組。對於“F”影象,使用整數或者浮點數。

對於調色盤影象(模式為“P”),使用整數作為顏色索引。在1.1.4

及其以後,使用者也可以使用RGB 3元組或者顏色名稱。繪製層將自動分配顏色索引,只要使用者不繪製多於256種顏色。

3、  Colours Names

PIL 1.1.4及其以後的版本,使用者繪製“RGB”影象時,可以使用字串常量。PIL支援如下字串格式:

A、 十六進位制顏色說明符,定義為“#rgb”或者“#rrggbb”。例如,“#ff0000”表示純紅色。

B、 RGB函式,定義為“rgb(red, green, blue)”,變數redgreenblue的取值為[0255]之間的整數。另外,顏色值也可以為[0%100%]之間的三個百分比。例如,“rgb(255, 0, 0)”和“rgb(100%, 0%, 0%)

”都表示純紅色。

C、 HSLHue-Saturation-Lightness)函式,定義為“hsl(hue,saturation%, lightness%)”,變數hue[0360]一個角度表示顏色(red=0 green=120 blue=240),變數saturation[0%100%]之間的一個值(gray=0%full color=100%),變數lightness[0%100%]之間的一個值(black=0% normal=50% white=100%)。例如,“hsl(0,100%, 50%)”為純紅色。

D、 通用HTML顏色名稱,ImageDraw模組提供了140個標準顏色名稱,Xwindow

系統和大多數web瀏覽器都支援這些顏色。顏色名稱對大小寫不敏感。例如,“red”和“Red”都表示純紅色。

4、  Fonts

PIL可以使用bitmap字型或者OpenType/TrueType字型。

Bitmap字型被儲存在PIL自己的格式中,它一般包括兩個檔案,一個叫.pil,它包含字型的矩陣,另一個通常叫做.pbm,它包含柵格資料。

ImageFont模組中,使用函式load()載入一個bitmap字型。

ImageFont模組中,使用函式truetype()載入一個OpenType/TrueType字型。注意:這個函式依賴於第三方庫,而且並不是在所有的PIL版本中都有效。

IronPIL)載入內建的字型,使用ImageFont模組的Font()結構函式即可。

二、ImageDraw模組的函式

1、  Draw

定義:Draw(image) Draw instance

含義:建立一個可以在給定影象上繪圖的物件。

IronPIL)使用者可以使用ImageWin模組的HWND或者HDC物件來代替影象。這個允許使用者直接在螢幕上繪圖。

注意:影象內容將會被修改。

例子:

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>> draw =ImageDraw.Draw(im01)

>>> draw.line((0,0) +im01.size, fill=128)

>>> draw.line((0,im01.size[1], im.size[0], 0), fill = 128)

>>> im01.show()

>>> del draw

在影象01上繪製了兩條灰色的對角線,如下圖:

                             

三、ImageDraw模組的方法

1、  Arc

定義:draw.arc(xy, start, end, options)

含義:在給定的區域內,在開始和結束角度之間繪製一條弧(圓的一部分)。

變數optionsfill設定弧的顏色。

例子:

>>> from PIL import Image,ImageDraw

>>> draw =ImageDraw.Draw(im01)

>>>draw.arc((300,300,500,500), 0, -90, fill = (0,255,0))

>>> im01.show()

>>> del draw

注意:變數xy是需要設定一個區域,此處使用4元組,包含了區域的左上角和右下角兩個點的座標。此PIL版本中,變數options不能使用outline,會報錯:“TypeError: arc() got an unexpected keyword argument 'outline'”;所以此處應該使用fill

在影象01(0,0,200,200)區域使用紅色繪製了90度的弧,(300,300,500,500)區域使用綠色繪製了270度的弧,(200,200,300,300)區域使用藍色繪製了90度的弧。這些弧都是按照順時針方向繪製的。變數start/end0度為水平向右,沿著順時針方向依次增加。繪製後的影象01如下圖:

 

2、  Bitmap

定義:draw.bitmap(xy, bitmap, options)

含義:在給定的區域裡繪製變數bitmap所對應的點陣圖,非零部分使用變數optionsfill的值來填充。變數bitmap點陣圖應該是一個有效的透明模板(模式為“1”)或者蒙版(模式為“L”或者“RGBA”)。

這個方法與Image.paste(xy, color, bitmap)有相同的功能。

例子:

>>> from PIL import Image,ImageDraw

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>> im02 =Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")

>>> im =im02.resize(300,200)>>> im.size

(300, 200)

>>> r,g,b =im.split()

>>> draw =ImageDraw.Draw(im01)

>>>draw.bitmap((0,0), r, fill = (255,0,0))

>>>draw.bitmap((300,200), g, fill = (0,255,0))

>>>draw.bitmap((600,400), b, fill = (0,0,255))

>>> im01.show()

變數xy是變數bitmap對應點陣圖起始的座標值,而不是一個區域。

影象im01如下:

 

3、  Chord

定義:draw.chord(xy,start, end, options)

含義:和方法arc()一樣,但是使用直線連線起始點。

變數optionsoutline給定弦輪廓的顏色。Fill給定弦內部的顏色。

例子:

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>> draw =ImageDraw.Draw(im01)

>>> draw.chord((0,0,200,200),0, 90, fill = (255,0,0))

>>> draw.chord((300,300,500,500), 0, -90, fill = (0,255,0))

>>> draw.chord((200,200,300,300), -90, 0, fill = (0,0,255))

>>> im01.show()

影象im01如下:

 

4、  Ellipse

定義:draw.ellipse(xy,options)

含義:在給定的區域繪製一個橢圓形。

變數optionsoutline給定橢圓形輪廓的顏色。Fill給定橢圓形內部的顏色。

例子:

>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>> draw =ImageDraw.Draw(im01)

>>> draw.ellipse((0,0, 200, 200), fill = (255, 0, 0))

>>> draw.ellipse((200,200,400,300),fill = (0, 255, 0))

>>>draw.ellipse((400,400,800,600), fill = (0, 0, 255))

>>> im01.show()

影象im01如下:

 

5、  Line

定義:draw.line(xy,options)

含義:在變數xy列表所表示的座標之間畫線。

座標列表可以是任何包含2元組[(x,y),…]或者數字[x,y,…]的序列物件。它至少包括兩個座標。

變數optionsfill給定線的顏色。

New in 1.1.5)變數optionswidth給定線的寬度。注意線連線不是很好,所以多段線段連線不好看。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.line([(0,0),(100,300),(200,500)], fill = (255,0,0), width = 5)

>>>draw.line([50,10,100,200,400,300], fill = (0,255,0), width = 10)

>>>im01.show()

影象im01如下:

 

6、  Pieslice

定義:draw.pieslice(xy,start, end, options)

含義:和方法arc()一樣,但是在指定區域內結束點和中心點之間繪製直線。

變數optionsfill給定pieslice內部的顏色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.pieslice((0,0,100,200), 0, 90, fill = (255,0,0))

>>>draw.pieslice((100,200,300,400), 0, -90, fill = (0,255,0))

>>> im01.show()

影象im01如下:

 

7、  Point

定義:draw.point(xy,options)

含義:在給定的座標點上畫一些點。

座標列表是包含2元組[(x,y),…]或者數字[x,y,…]的任何序列物件。

變數optionsfill給定點的顏色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>> draw.point([(0,0),(100,150), (110, 50)], fill = (255, 0, 0))

>>> draw.point([0,10,100,110, 210, 150], fill = (0, 255, 0))

>>>im01.show()

影象im01上在對應的座標點上會有紅色/綠色的點,每個點只佔一個畫素點。影象如下:

 

8、  Polygon

定義:draw.polygon(xy,options)

含義:繪製一個多邊形。

多邊形輪廓由給定座標之間的直線組成,在最後一個座標和第一個座標間增加了一條直線,形成多邊形。

座標列表是包含2元組[(x,y),…]或者數字[x,y,…]的任何序列物件。它最少包括3個座標值。

變數optionsfill給定多邊形內部的顏色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>> draw.polygon([(0,0),(100,150), (210, 350)], fill = (255, 0, 0))

>>> draw.polygon([300,300,100,400, 400, 400], fill = (0, 255, 0))

>>>im01.show()

影象01如下:

 

9、  Rectangle

定義:draw.rectangle(box,options)

含義:繪製一個長邊形。

變數box是包含2元組[(x,y),…]或者數字[x,y,…]的任何序列物件。它應該包括2個座標值。

注意:當長方形沒有沒有被填充時,第二個座標對定義了一個長方形外面的點。

變數optionsfill給定長邊形內部的顏色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.rectangle((0,0,100,200), fill = (255,0,0))

>>> draw.rectangle([100,200,300,500],fill = (0,255,0))

>>>draw.rectangle([(300,500),(600,700)], fill = (0,0,255))

>>>im01.show()

影象01如下:

 

10、             Text

定義:draw.text(position,string, options)

含義:在給定的位置繪製一個字元創。變數position給出了文字的左上角的位置。

變數optionfont用於指定所用字型。它應該是類ImangFont的一個例項,使用ImageFont模組的load()方法從檔案中載入的。

變數optionsfill給定文字的顏色。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>> draw.text((0,0),"Hello", fill = (255,0,0))

>>>im01.show()

在影象01(0,0)位置繪製出字串“Hello”。

11、             Textsize

定義:draw.textsize(string,options) (width, height)

含義:返回給定字串的大小,以畫素為單位。

變數optionfont用於指定所用字型。它應該是類ImangFont的一個例項,使用ImageFont模組的load()方法從檔案中載入的。

例子:

>>>from PIL import Image, ImageDraw

>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")

>>>draw = ImageDraw.Draw(im01)

>>>draw.textsize("Hello")

(30, 11)

>>>draw.textsize("Hello, the world")

(96, 11)

>>>im01.show()

四、ImageDraw模組的option變數

Option變數有三個屬性,分別為outlinefillfontOutlinefill都可為整數或者元組;fontImageFont類的例項。

這幾個屬性在前面方法介紹中都有用到,這裡不作解釋。

五、ImageDraw模組的相容性

Draw包括的一個建構函式和一些方法提供向後相容。為了使這些函式正常工作,使用者應該使用options,或者使用這些方法。但不能混合舊的和新的呼叫習慣。

IronPILIronPIL不支援這些有相容性的方法。

1、  ImageDraw

定義:ImageDraw(image) Draw instance

含義:(不贊成)生成Draw的例項。新程式碼中不要用這個函式。

2、  Setink

定義:draw.setink(ink)

含義:(不贊成)為後續繪製和fill屬性設定顏色。

3、   Setfill

定義:draw.setfill(mode)

含義:(不贊成)設定fill屬性。

如果變數mode0,後續繪製的形狀(像多邊形和長方形)都是輪廓。如果mode1,則它們會被填充。

4、  Setfill

定義:draw.setfont(font)

含義:(不贊成)為text()方法設定預設的字型。

變數font是ImageFont類的例項,使用ImageFont模組的load()方法從檔案中載入的。