本文首发于: 行者 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 io
packet = 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 办法。