第0000題:將你的QQ頭像(或者微博頭像)右上角加上紅色的數字,類似于微信未讀信息數量那種提示效果。
本題用了Python中最常用的圖像處理庫PIL,推薦閱讀官方文檔
處理思路:
- 通過Image類中的open方法載入圖像文件并用Image類的size屬性獲取圖片大小
- 用ImageFont類的truetype方法載入字體并設置字體大小
- 用ImageDraw類的Draw方法在圖片左上角加上數字
- 保存加上數字的圖片
示例代碼如下:
! /usr/bin/env python
coding=utf-8
from PIL import Image, ImageDraw, ImageFont
def add_num(picPath, num):
img = Image.open(picPath)
x, y = img.size
myFont = ImageFont.truetype('verdana.ttf', x/3)
ImageDraw.Draw(img).text((2*y/3, 0), str(num), fill='red', font=myFont)
img.save('pic_with_num.jpg')
if name == 'main':
add_num('in.jpg', 9)
主要類的說明:
PIL的主要功能定義在Image類當中,而Image類定義在同名的Image模塊當中。使用PIL的功能,一般都是從新建一個Image類的實例開始。新建Image類的實例有多種方法。你可以用Image模塊的 open()函數打開已有的圖片檔案,也可以處理其它的實例,或者從零開始構建一個實例。
from PIL import Image
sourceFileName = "source.png"
avatar = Image.open(sourceFileName)
查看實例的屬性
Image 類的實例有5個屬性,分別是:
- format: 以 string 返回圖片檔案的格式(JPG, PNG, BMP, None, etc.);如果不是從打開文件得到的實例,則返回 None。
- mode: 以 string 返回圖片的模式(RGB, CMYK, etc.);完整的列表參見 官方說明·圖片模式列表
- size: 以二元 tuple 返回圖片檔案的尺寸 (width, height)
- palette: 僅當 mode 為 P 時有效,返回 ImagePalette 示例
- info: 以字典形式返回示例的信息
ImageDraw 模塊
ImageDraw模塊提供了Draw類,它能在Image實例上進行簡單的 2D 繪圖。當然復雜的繪圖動作是由簡單的動作合成而得的,理論上這些動作ImageDraw模塊也能做,只是相對復雜。如果你想在Image實例上做復雜的繪圖動作,最好是自行對ImageDraw模塊提供的各種方法做一些封裝。
在圖片上寫字
Draw類提供了text(position, string, options)方法,該方法可以在 Image 實例上寫字。
需要說明的是,position 指定的是文本左上角的頂點,而不是文本中心。這里可用的options有:
- font = ImageFont instance - 指定字體,接受一個 ImageFont 的實例
- fill = (R, G, B) - 用于指定線條的顏色,其中 R、G、B 都是 0 – 255 的整數
ImageFont 模塊
ImageFont模塊很簡單,它定義了一個同名的類。ImageFont類的實例可以傳給ImageDraw中 text 方法的 font 的參數,起到字體選擇的作用。
ImageFont模塊中的truetype(fontfile, fontsize)函數則可以加載TrueType或OpenType格式的字體,并返回ImageFont參數。不過 truetype 函數需要額外安裝_imagingft 模塊。