zoukankan      html  css  js  c++  java
  • 用技术的方式,在UI设计稿中设置随机码,保证高清

    本文首发于:行者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方法。


    PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!

  • 相关阅读:
    动手动脑3
    AWK编程与应用
    BASH内置变量的使用
    服务器交互脚本expect
    编程对话框的界面程序
    每日打卡
    AppiumLibrary中文翻译
    Bootstrap4简单使用
    Python基础06-类与对象
    BDD模式-Python behave的简单使用
  • 原文地址:https://www.cnblogs.com/xingzheai/p/14266117.html
Copyright © 2011-2022 走看看