ImageDraw
新建一個空白圖片為本文作示例,新建空白文件的方法 見Image模塊,Image.new:
import Image blank = Image.new("RGB",[1024,768],"white")
1、模塊引入
import ImageDraw2、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")
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")
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")
6、drawObject.chord([x1, y1, x2, y2], startAngle, endAngle, options)
用法與arc相同,用來畫圓從startAngle到endAngle的弦。
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")
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")
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")
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)
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")
11、drawObject.textsize(string, options)
這個函數返回一個兩元素的元組,是給定字符串像素意義上的size
ImageFont
1、模塊引入
import ImageFont2、 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)
注意:
畫筆顏色默認為透明的,直接在白紙上寫字是看不到的。所以上面的例子中要先畫出一個被顏色填充過的矩形框,在矩形框內添加文字。
畫筆的顏色可以通過draw的ink屬性來改變:
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)![]()
3、Font.getsize(text)
返回一個二元素元組,為指定text在指定字體大小之后的size
Questions:
① Getsize()與textsize()的區別與用途
② 字體加粗、傾斜、下划線、刪除線等的設置
③ 畫圖時線寬的規定
④ 線型設置(加粗,虛線...)

![[lineImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTA1ODIxMjM0P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[arcImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTEyMTI3ODkwP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[ellipseImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTMxNTE3ODU5P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[chorbImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTMyMzI0MjM0P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[pieImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTMzMDMyMDc4P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[polygonImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTM0MDM5Mzc1P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[recImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTM0ODMxMDc4P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[testImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTQwMTEwODQzP3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)
![[fontImage]](/image/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTMxMjMwMTQxODI0MjM0P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdlJHOTFYME5QL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvU291dGhFYXN0.png)