1. 程式人生 > >python練習冊第零題

python練習冊第零題

說明

這個是網上一些大佬做的一套練習題,總共有25題,訓練大家python在檔案讀取、文字處理、資料庫、網頁等方向的熟練度,十分有用。github地址在這:

python 練習冊 每天一個小程式

上不了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()   

0_1.png

別人的解決方法

我的方法是看文件做出來的,確實沒有看過別人的原始碼。不過看起來思路一樣,就是他的在細節方面比我更好。

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')