題目
第 0000 題: 将你的 QQ 頭像(或者微網誌頭像)右上角加上紅色的數字,類似于微信未讀資訊數量那種提示效果。 類似于圖中效果
Code:
1 from PIL importImage,ImageDraw,ImageFont2 #path = "F:\Python Learning\Python_Exercise"
3 #讀取圖檔資料
4 iconPath = r"Image\WeChart.png"
5 #labelPath = r"Image\圓圈.png"
6 iconImage=Image.open(iconPath,'r')7 #labelImage = Image.open(labelPath,"r")
8
9 ## 标簽上寫字
10 #user_font = ImageFont.truetype('simsun.ttc',80)
11 #draw = ImageDraw.Draw(labelImage)
12 #draw.text((int(labelImage.size[0]/4),int(labelImage.size[1]/7)),u'24',font=user_font)
13 #labelImage.save("final.png","PNG")
14
15 #組合Icon
16 icon = Image.new("RGBA",(iconImage.size[0]+105,iconImage.size[1]+105))17 #iconImage.paste(labelImage,(int(iconImage.size[0]-labelImage.size[0]/2-1),0))
18 #iconImage.save("final.png","PNG")
19 #右上角數字标簽會導緻圖檔尺寸變大
20 icon.paste(iconImage,(0,54))21 draw =ImageDraw.Draw(icon)22 #直接在圖檔上畫圓
23 draw.ellipse([(iconImage.size[0]-100,5),(iconImage.size[1]+100,205)],"red")24 user_font = ImageFont.truetype('simsun.ttc',100)25 #标注數字
26 draw.text((iconImage.size[0]-50,50),u'24',"white",font=user_font)27 icon.save("final.png","PNG")
Result:
總結:
Pillow API 學習
API 文檔路徑:http://pillow-cn.readthedocs.io/zh_CN/latest/reference/index.html
(1) PIL.Image.new(mode,size,color)
mode: 新圖檔的模式,如RGB,灰階圖相等
size: 新圖象的尺寸,元組對象(a,b)
color: 圖像的填充對象
傳回圖像對象
(2) Image.size
擷取圖像尺寸,傳回的是元組對象
由于傳回是元組對象,則通路結果是Image.size[0]
(3) ImageDraw.Draw(im,mode=None)
建立可在圖檔上進行繪制Draw對象
(4) Image.paste(sourceImg,box=None,mode=None)
将一張圖檔粘貼到另一張圖檔上
Image對象指的是被粘貼的圖檔
sourceImg: 粘貼的源圖檔
box: 2元組則是粘貼圖檔位置的左上角開始位置
4元組則是左上角,同時包括右下角,必須符合源圖檔的尺寸内
mode:圖檔模式
(5) ImageFont.trueType(font=None,size=None,index=0,filename=None)
設定圖檔上字型
filename: 設定字型檔案,如若沒有則是找Window字型
size: 字型大小
(6) ImageDraw.Draw.eclipse(xy,fill=None,outline=0)
圖檔上繪制橢圓
xy:兩種方式
[(x0,y0),(x1,y1)],[x0,y0,x1,y1]左上角,右上角坐标
如果要畫圓形則是保證兩軸長度相等
fill: 橢圓内部是否填充,填充色
outline:橢圓輪廓寬度
(7) ImageDraw.text(xy,text,fill=None,font=None)
xy: 字的右上角的位置
text:書寫的問題,注意編碼格式
fill:文本的顔色
font:引入字型
編碼經驗的總結
(1) 如果不是矢量圖可能會造成疊加圖檔未着色遮蓋,故最終選擇兩個圖檔疊加,而是直接在圖檔上繪制圓形
(2)關于圖檔字型仍然還需進一步的學習,因為想引入微軟雅黑,結果沒成功,還有就是如何加粗?
(3) 如何讓文字自适應在圖檔中間,C++中有擷取字型的像素大小,還得再研究Pillow是否有這個函數?
拓展
(1) 如何抹去上面的數字标簽,模拟微信已讀
(2) 如何更新上面的數字,模拟不斷接受新的消息,未讀
思路:
code改編為函數,輸入參數為未讀消息資料,擷取原始圖檔的畫筆
事件響應傳入相應的參數