本文首發于:行者AI
在工作中會遇到批量給圖片添加文字,隨機碼等需求,當數據碼數量較大時,UI的工作量就會非常大,這時候我們可以用python來幫我們提高工作效率。
1. 需求分析
我們有這樣一張圖片,我們需要將一批隨機碼添加到圖片的固定位置。

2. OpenCV方法
在圖片中添加文字看上去很簡單,但是如果是利用OpenCV來做卻很麻煩。OpenCV中并沒有使用自定義字體文件的函數,這不僅意味著我們不能使用自己的字體,而且意味著他無法顯示中文字符。這還是非常要命的事情。而且他顯示出來的文字位置也不太好控制,比如下面的代碼:
import cv2
import numpy as np
from pylab import *
#使用默認字體
font=cv2.FONT_HERSHEY_SIMPLEX
#新建圖像
im=np.zeros((50,50,3),np.uint8)
#添加文字,1.2表示字體大小,(0,40)是初始的位置,(255,255,255)表示顏色,2表示粗細
img=cv2.putText(im,'行者AI',(0,40),font,1.2,(255,255,255),2)
imshow(img)
在實際運用中發現文字出現的位置并不怎么好把握,初始的坐標默認是指左下角的坐標不怎么方便,而且顯示出文字以后我們也不好掌握他實際占的位置和大小。但也有方便之處就是,我們可以隨意改變他的粗細,而不用更換字體。
3. PIL方法
使用PIL方法我們可以對字體,顏色等參數進行更加細致的配置。
from PIL import Image, ImageDraw, ImageFont
#打開原圖
image = Image.open(filepath)
# 新建繪圖對象
draw = ImageDraw.Draw(image)
image.show()
#可配置字體 字號 顏色
draw.text(size, text, font=setFont, fill=fillColor, direction=None)
#保存文件
pic_save(image, filename)

我們可以發現,PIL支持使用自定義的字體文件,而且能夠提供字體所占位置的詳細信息,我們可以精確的確定文字所占的位置,在應用中特別有用。唯一的不足就是他不能改變字體的粗細(畢竟這用的是字體模板)。
4. PyPDF2方法
使用后發現 PIL方法更加好用, 可以迅速確定文字所占的位置, 但是我們需要將圖片打印出來,這涉及到了清晰度的問題,上訴兩種方法都無法保證圖片清晰度和UI設計稿一致,所以我們選擇將UI設計稿直接裝換為pdf格式,再使用pypdf將文字添加到pdf上保證清晰度,代碼如下:
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch, mm
import iopacket = io.BytesIO()
# 使用Reportlab創建一個新的PDF
can = canvas.Canvas(packet, pagesize=letter)
# 設置字體 和字號
can.setFont(font, size)
# 設置顏色
can.setFillColorRGB(1, 1, 1)
can.rotate(rotate)
# 更多顏色配置
# can.setStrokeColorRGB(0.2, 0.5, 0.3)
# can.setFillColorRGB(255, 20, 147)
# can.setStrokeColorRGB(220, 20, 60)can.drawString(x * mm, y * mm, text) # RTL
can.showPage()
can.save()
# buffer從偏移0開始
packet.seek(0)
new_pdf = PdfFileReader(packet)
# 讀取已有的PDF
existing_pdf = PdfFileReader(open(old_pdf, "rb"))
output = PdfFileWriter()
# 在pdf第一頁操作
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# 最后,向目標的pdf寫出
outputStream = open(out_new_pdf, "wb")
output.write(outputStream)
outputStream.close()

5. 總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用python能帶來一定的幫助,如果對圖片清晰度要求不高使用PIL方法更加便捷, 如果需要高清打印,建議使用PyPDF2方法。
PS:
我們是行者AI,我們在“AI+游戲”中不斷前行。
快來【公眾號 | xingzhe_ai】,和我們討論更多技術問題吧!