Python PIL ImageDraw 和ImageFont模塊學習


 

ImageDraw

 新建一個空白圖片為本文作示例,新建空白文件的方法 見Image模塊,Image.new:

import Image
blank = Image.new("RGB",[1024,768],"white")

     

1、模塊引入

import ImageDraw

2、ImageDraw.Draw(image)

       創建一個可用來對image進行操作的對象。對所有即將使用ImageDraw中操作的圖片都要先進行這個對象的創建。

drawObject = ImageDraw.Draw(blank)

3、drawObject.line([x1,y1,x2,y2] ,options)
       以(x1,y1)為起始點,以(x2,y2)為終止點划一條直線。
       [x1,y1,x2,y2]也可以寫為:(x1,y1,x2,y2),[(x1,y1),(x2,y2)]等,options選項包含的fill選項規定線條顏色,具體方法如下各例所示:

drawObeject.line([100,100,100,600],fill = 10)
drawObject.line([(100,100),600,100],fill = 128)
drawObject.line([(600,100),(600,600)],"black")
drawObject.line((100,600,600,600),fill = "yellow")

[lineImage]

4、drawObject.arc([x1, y1, x2, y2],  startAngle,  endAngle,  options)

在左上角坐標為(x1,y1),右下角坐標為 (x2,y2)的矩形區域內滿圓O內,以starangle為起始角度,endAngle為終止角度,截取圓O的一部分圓弧畫出來

(如果[x1,y1,x2,y2]區域不是正方形,則在該區域內的最大橢圓中根據角度截取片段)

注意:

       [x1,y1,x2,y2]規定矩形框的水平中位線為0度角,角度順時針變大(與數學坐標系規定方向相反!!)

options規定圓弧線的顏色。具體方法同drawObject.line

#畫一個60度藍色圓弧
drawObject.arc((100,100,600,600),0,90,fill = "blue")
#畫一個上半圓弧
drawObject.arc((100,100,600,600),180,360,fill = "red")
#畫一個右半橢圓,只需改區域大小為長方形
drawObject.arc((100,100,600,400),90,270,fill = "blue")

[arcImage]

5、drawObject.ellipse([x1,y1,x2,y2],  options)

用法同arc,用於畫圓(或者橢圓)

Options選項中fill表示將圓(或者橢圓)用指定顏色填滿,outlie表示只規定圓的顏色

drawObject.ellipse((100,100,600,600),outline = 128)
drawOject.ellipse((100,250,600,450),fill = "blue")

[ellipseImage]

6、drawObject.chord([x1, y1, x2, y2],  startAngle,  endAngle,  options)

用法與arc相同,用來畫圓從startAngleendAngle的弦。

Options選項中fill表示將弦與圓弧之間空間用指定顏色填滿,outlie表示只規定弦線的顏色

畫一個圓,並在園內畫弦示例如下:

#畫圓
drawObject.ellipse((100,100,600,600),outline = 128)
#畫一條弦
drawObject.chord((100,100,600,600),0,90,outline = "red")
#畫弦並且將弦與弧包圍區域塗色
drawObject.chord((100,100,600,600),90,180,fill = "red")

[chorbImage]

7、drawObject.pieslice([x1,y1,x2,y2],  startAngle,  endAngle,  options)

用法與ellipse相同,用於畫起始角度間的扇形區域

options選項中fill選項將扇形區域用指定顏色填滿,outline選項只用指定顏色描出區域輪廓,示例如下:

#畫一個圓
d.ellipse((100,100,600,600),outline = 128)
#在上一行畫出的園內畫180度到210度的扇形區域輪廓
d.pieslice((100,100,600,600),180,210,outline = 128)
#畫60度到90度的扇形區域
d.pieslice((100,100,600,600),60,90,fill = "blue")

[pieImage]

8、drawObject.polygon(([x1,y1,x2,y2…],options)

根據坐標畫多邊形,python會根據第一個參量中的xy坐標對,連接出整個圖形

options選項中fill選項將多邊形區域用指定顏色填滿,outline選項只用指定顏色描出區域輪廓,示例如下:

d.polygon([(200,200),(600,300),(300,600)],outline = "red")
d.polygon([(300,300),(500,300),(300,500),(500,500)],fill = "red")

[polygonImage]

9、drawObeject.rectangle([x1,y1,x2,y2],options)

在給定區域內畫一個矩形,(x1,y1)表示矩形左上角坐標值,(x2,y2)表示矩形右下角坐標值

options選項中fill選項將多邊形區域用指定顏色填滿,outline選項只用指定顏色描出區域輪廓,示例如下:

#畫矩形
drawObject.rectangle((200,200,500,500),outline = "red")
drawObject.rectangle((250,300,450,400),fill = 128)

[recImage]

10、drawObject.text(position,  string,  options)

在圖像內添加文字

Position是一個二元元組,指定字符串左上角坐標,string是要寫入的字符串

options選項可以為fill或者font(只能選擇其中之一作為第三參量,不能兩個同同時存在,要改變字體顏色,見ImageFont模塊中的NOTE)。其中fill指定字的顏色,font指定字體與字的尺寸,font必須為ImageFont中指定的font類型,具體用法見ImageFont.Truetype()

第三參量為font示例參見下文ImageFont.Truetype(),第三那參量為fill時示例如下:

#在空白圖像上矩形區域內添加文字
text = "I love python!"
d.rectangle((200,200,500,500),outline = "red")
d.text([300,350],text,"red")

[testImage]

11、drawObject.textsize(string,  options)

這個函數返回一個兩元素的元組,是給定字符串像素意義上的size

ImageFont

1、模塊引入

import ImageFont

2、 ImageFont.truetype(filename ,   wordsize)

這個函數創建字體對象給ImageDraw中的text函數使用

Filename是字體文件的名稱,通常為ttf文件,還有少數ttc文件,可以在C:\Windows\Fonts中找到。

“simsun.ttc是三種ttf文件的集合,是宋體、新宋體、宋體-PUA”三種字體的集合,可以通過在truetype中增加index參量實現對集合內字體的調用

Eg.font = ImageFont.truetype("simsun.ttc",24,index=1) “

(我看到網上說是三種字體的集合,但是我試驗的過程中發現似乎只有兩種)

Wordsize參數指定字的大小。結合drawObject.text()示例如下:

text = "I love python!"
d.rectangle((100,100,600,600),fill = 128)
#字體對象1為simsunb,字大小為36號
Font1 = ImageFont.truetype("C:\Windows\Fonts\simsunb.ttf",36)
#字體對象2在ttc中第一個(我也不知道具體是什么字形),字大小為36號
Font2 = ImageFont.truetype("C:\Windows\Fonts\simsun.ttc",36,index = 0)
#字體對象2在ttc中第二個,字大小為36號
Font3 = ImageFont.truetype("C:\Windows\Fonts\simsun.ttc",36,index = 1)
#字體對象1為SHOWG,字大小為48號
Font4 = ImageFont.truetype("C:\Windows\Fonts\SHOWG.TTF",48)

#利用text函數添加文字
drawObject.text([200,200],text,font = Font1)
drawObject.text([200,250],text,font = Font2)
drawObject.text([200,300],text,font = Font3)
drawObject.text([200,400],text,font = Font4)

[fontImage]

注意:

畫筆顏色默認為透明的,直接在白紙上寫字是看不到的。所以上面的例子中要先畫出一個被顏色填充過的矩形框,在矩形框內添加文字。

畫筆的顏色可以通過drawink屬性來改變:

draw.ink = 0(R) + 0(G) * 256 + 0(B) * 256 * 256

text = "I love python!"
d.rectangle((100,100,600,600),outline = 128)
#字體對象1為simsunb,字大小為36號
Font1 = ImageFont.truetype("C:\Windows\Fonts\simsunb.ttf",36)
#字體對象2在ttc中第一個(我也不知道具體是什么字形),字大小為36號
Font2 = ImageFont.truetype("C:\Windows\Fonts\simsun.ttc",36,index = 0)
#字體對象2在ttc中第二個,字大小為36號
Font3 = ImageFont.truetype("C:\Windows\Fonts\simsun.ttc",36,index = 1)
#字體對象1為SHOWG,字大小為48號
Font4 = ImageFont.truetype("C:\Windows\Fonts\SHOWG.TTF",48)
#在圖像上寫字
d.ink = 0 + 0 * 256 + 0 * 256 * 256         #黑色
d.text([200,200],text,font = Font1)
d.ink = 255 + 0 * 256 + 0 * 256 * 256       #紅色
d.text([200,250],text,font = Font2)
d.ink = 0 + 0 * 256 + 255 * 256 * 256       #藍色
d.text([200,300],text,font = Font3)
d.text([200,400],text,font = Font4)
[Image]

3、Font.getsize(text)

返回一個二元素元組,為指定text在指定字體大小之后的size

 

 

Questions:

   Getsize()與textsize()的區別與用途

   字體加粗、傾斜、下划線、刪除線等的設置

   畫圖時線寬的規定

   線型設置(加粗,虛線...)

 


免責聲明!

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



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