python練習冊第零題
說明
這個是網上一些大佬做的一套練習題,總共有25題,訓練大家python在檔案讀取、文字處理、資料庫、網頁等方向的熟練度,十分有用。github地址在這:
上不了github的可以直接搜名字,應該能搜到。
我這個筆記集也是隻記了五道題。。。我大概多做了一兩題吧,唉。。。。。。
題目:
將你的 QQ 頭像(或者微博頭像)右上角加上紅色的數字,類似於微信未讀資訊數量那種提示效果。類似於圖中效果:
學習內容
雖然python學的不久,但是用Pillow庫解決影象方面的問題還是知道的。這個題目的解決思路就是:如何用Pillow庫實現在一個影象的某一個畫素位置插入一個text欄位。
Load an Image
To load an image from a file, use the open()
function in the Image module:
>>> from PIL import Image
>>> im = Image.open("hopper.ppm")
If successful, this function returns an Image object. If the file cannot be opened, an IOError
exception is raised.
ImageFont Module
The ImageFont
module defines a class with the same name. Instances of this class store bitmap fonts, and are used with the PIL.ImageDraw.Draw.text()
method.
font字型在Image模組中被當做bitmap點陣圖處理,也就是一種圖片格式。新增字型其實就是在一張圖片上新增bitmap格式的font圖片。
from PIL import ImageFont, ImageDraw draw = ImageDraw.Draw(image) # use a bitmap font font = ImageFont.load("arial.pil") draw.text((10, 10), "hello", font=font) # use a truetype font font = ImageFont.truetype("arial.ttf", 15) draw.text((10, 25), "world", font=font)
ImageDraw Module
Example: Draw Partial Opacity Text
from PIL import Image, ImageDraw, ImageFont
# get an image
base = Image.open('Pillow/Tests/images/hopper.png').convert('RGBA')
# make a blank image for the text, initialized to transparent text color
txt = Image.new('RGBA', base.size, (255,255,255,0))
# get a font
fnt = ImageFont.truetype('Pillow/Tests/fonts/FreeMono.ttf', 40)
# get a drawing context
d = ImageDraw.Draw(txt)
# draw text, half opacity
d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128))
# draw text, full opacity
d.text((10,60), "World", font=fnt, fill=(255,255,255,255))
out = Image.alpha_composite(base, txt)
out.show()
PIL.ImageDraw.ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None)
解決程式碼
from PIL import Image, ImageFont, ImageDraw
image = Image.open(r'C:\Users\ChanWunsam\Desktop\0.png')
draw = ImageDraw.Draw(image)
font = ImageFont.truetype('arial.ttf', 25)
draw.text((230,10), '10', fill='red', font=font)
# del draw ## 釋放ImageDraw.Draw快取,不過不影響結果,感覺也非必要
image.save(r'C:\Users\ChanWunsam\Desktop\0_1.png', format='PNG')
image.close()
別人的解決方法
我的方法是看文件做出來的,確實沒有看過別人的原始碼。不過看起來思路一樣,就是他的在細節方面比我更好。
from PIL import Image, ImageFont, ImageDraw
image = Image.open('0.png')
w, h = image.size
font = ImageFont.truetype('arial.ttf', 50)
draw = ImageDraw.Draw(image)
draw.text((4*w/5, h/5), '5', fill=(255, 10, 10), font=font)
image.save('0.0.png', 'png')