Show me the code_0000題

第0000題:將你的QQ頭像(或者微博頭像)右上角加上紅色的數字,類似于微信未讀信息數量那種提示效果。

本題用了Python中最常用的圖像處理庫PIL,推薦閱讀官方文檔

處理思路:

  1. 通過Image類中的open方法載入圖像文件并用Image類的size屬性獲取圖片大小
  2. 用ImageFont類的truetype方法載入字體并設置字體大小
  3. 用ImageDraw類的Draw方法在圖片左上角加上數字
  4. 保存加上數字的圖片

示例代碼如下:

! /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 模塊。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容