Python图片添加好看的中文字体并根据图片动态改变文字大小

前言

使用opencv或者PIL在图片上写英文字是非常容易的,但是写中文字时却会出现乱码或者写出来的字特别丑,如何在图片中写出自己想要的好看的字体就是本节会详细介绍的。同时我们可能会遇到一些需求,例如输入的图片大小并不是每次都是一致的,若是重复使用同一大小的字体,在面对不同图片时就会出现过大或过小不清晰的情况,如果让展示字体会随着图片的大小动态改变也是本节会详细介绍的。话不多说,先展示代码与效果

Code and Performance

import numpy as np
import cv2
from PIL import Image, ImageDraw, ImageFont


def cv2AddChineseText(img, text, position, fontpath, textColor=(0, 255, 0), textSize=60):
    """取自别人博客,暂时找不到博客地址了
    用于给图片添加文字
    """
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        fontpath, textSize, encoding="utf-8")
    # 绘制文本
    draw.text(position, text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)


def get_font_size(img_fraction, photo, text, fontsize, font_path):
    """摘自Nachtalb的回答https://cloud.tencent.com/developer/ask/sof/87148
    获取给定图片比例下的最合适大小
    """
    font = ImageFont.truetype(font_path, fontsize)
    # 输入photo [height, width, channel]
    breakpoint = img_fraction * photo.shape[1]
    jumpsize = 75
    while True:
        # font.getsize() 可以获得当前文本所占图片大小,维度是[width, height]
        # 用二分查找的方式搜索在给定比例下的最合适的size
        if font.getsize(text)[0] < breakpoint:
            fontsize += jumpsize
        else:
            jumpsize = jumpsize // 2
            fontsize -= jumpsize
        font = ImageFont.truetype(font_path, fontsize)
        if jumpsize <= 1:
            break
    return fontsize, font.getsize(text)


#设置font路径,需要输入文本
font_path = "C:\Windows\Fonts\STKAITI.TTF"
text = f'你好世界,拥抱太阳'
# 创建一张空白的图 [800 × 800]
# 注意用numpy生成空白图片时,类型必须为np.uint8
imgsize = 1000
img = np.ones((imgsize, imgsize, 3), dtype=np.uint8) * 255
# font从1开始
fontsize, font_region = get_font_size(img_fraction=0.5, photo=img,
                                          text=text, fontsize=1,
                                          font_path=font_path)
img = cv2AddChineseText(img, text, position=(0,0), textColor=(0,0,0),
                             textSize=fontsize, fontpath=font_path)

# 展示图片
cv2.namedWindow("match results", 0)
cv2.resizeWindow("match results", 960, 640)
cv2.imshow('match results', img)
cv2.waitKey(5000)
cv2.destroyAllWindows()

在这里插入图片描述

整体思路

对于在图片中写出好看的字体,其重点就在于字体文件,我在这里使用的时windows自带的华文楷体,这个字体我觉得挺好看的,比固定的simhei的要看的多,事实上只要时ttf,ttc格式的字体文件,PIL都可以使用,因此大家可以选择好看的字体,并调用就可以了

然后就是字体的动态缩放,在例子中我们使用的比例是图片的一半,因此不管图片大小如何改变,文字的宽度始终会占图片的一半,而使用的方法是二分查找,直到查到合适的字体大小。

结论

通过PIL可以方便的在图片上写出好看的字体,并且只要有字体,不管什么国家的文字都可以展示,还可以通过动态调整字体大小的方式,让文本在不同分辨率的图片上,清晰的展示出来

参考

PIL如何根据图像大小缩放文本大小

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值