在Python中常用的两个图像处理库,一个opencv,一个是PIL。其中,opencv是不支持中文显示的,所以只能显示英文。详细实现如下代码:

# -*- coding: utf-8 -*-#
# Author:      weiz
# Date:        2020/1/13 下午6:26
# Name:        testFont.py
# Description: 让文字信息以表格的形式在图片中显示
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import cv2def is_chinese(uchar):"""判断一个unicode是否是汉字:param uchar::return:"""if uchar >= u'\u4e00' and uchar<=u'\u9fa5':return Trueelse:return Falsedef fitImageSize_pil(img, fontsize, font_w, font_h, row, longestChn, gap):"""适配图片大小:param img::param fontsize::param font_w::param font_h::param row::param longestChn::param gap::return:"""img_h, img_w = img.shape[:2]h_rate = (font_h * row) / img_hw_rate = font_w / img_wwhile (max(h_rate, w_rate) <= 0.7) or (max(h_rate, w_rate) >= 0.9):if max(h_rate, w_rate) <= 0.7:fontsize = fontsize + 1font = ImageFont.truetype("simhei.ttf", fontsize, encoding="utf-8")font_w, font_h = font.getsize(longestChn)font_w = font_w + 2 * gapfont_h = font_h + 2 * gaph_rate = (font_h * row) / img_hw_rate = font_w / img_wif max(h_rate, w_rate) >= 0.9:fontsize = fontsize - 1font = ImageFont.truetype("simhei.ttf", fontsize, encoding="utf-8")font_w, font_h = font.getsize(longestChn)font_w = font_w + 2 * gapfont_h = font_h + 2 * gaph_rate = (font_h * row) / img_hw_rate = font_w / img_wfont = ImageFont.truetype("simhei.ttf", fontsize, encoding="utf-8")return font, font_w, font_hdef showChn4table_pil(img, chnList, fontsize=None, gap=None, start_x=None, start_y=None):"""以表格的形式在图片的居中(默认是居中)显示中文或者英文字符:param img::param chnList::param fontsize::param gap:表格和字体之间的距离:param start_x::param start_y::return:"""row = len(chnList)if gap == None:gap = 2if fontsize == None:fontsize = 20longestChn = ""longestChn_count = 0# 涉及到中文汉字,一个汉字占两个字节。但是len()函数只计算字符串的个数,而显示涉及到像素for chnStr in chnList:count = 0for chn in chnStr:if is_chinese(chn):count += 1count = (len(chnStr) - count) + count * 2if count > longestChn_count:longestChn = chnStrlongestChn_count = countimg_h, img_w = img.shape[:2]pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_img)# 如果是在Linux系统下运行,可能需要把simhei.ttf字体放到当前运行脚本同路径下font = ImageFont.truetype("simhei.ttf", fontsize, encoding="utf-8")font_w, font_h = font.getsize(longestChn)font_w = font_w + 2 * gapfont_h = font_h + 2 * gapfont, font_w, font_h = fitImageSize_pil(img, fontsize, font_w, font_h, row, longestChn, gap)# 修改start_x和start_y就可以在图片的任意位置显示if start_x == None:start_x = (img_w - font_w) // 2if start_y == None:start_y = (img_h - font_h * row) // 2end_x = start_x + font_wend_y = start_y + font_h * rowfor i, chnStr in enumerate(chnList):line_spacing = i * font_hdraw.text((start_x+gap, start_y+line_spacing+gap), chnStr, (0, 0, 0), font)draw.line((start_x, start_y+line_spacing, end_x, start_y+line_spacing), 'red')draw.line((start_x, end_y, end_x, end_y), 'red')draw.line((start_x, start_y, start_x, end_y), 'red')draw.line((end_x, start_y, end_x, end_y), 'red')img = cv2.cvtColor(np.asarray(pil_img), cv2.COLOR_RGB2BGR)return imgdef showEng4table_cv(img, engList, fontScale=None, gap=None, start_x=None, start_y=None):"""以表格的形式在图片的居中(默认是居中)显示英文字符(opencv不支持中文):param img::param engList::param fontScale::param gap:表格和字体之间的距离:param start_x::param start_y::return:"""row = len(engList)if gap == None:gap = 2if fontScale == None:fontScale = 1longestEng = ""for engStr in engList:if len(engStr) > len(longestEng):longestEng = engStrimg_h, img_w = img.shape[:2](font_w, font_h), baseline = cv2.getTextSize(longestEng, cv2.FONT_HERSHEY_TRIPLEX, fontScale, 1)font_h = font_h + baseline + 2 * gapfont_w = font_w + 2 * gapif start_x == None:start_x = (img_w - font_w) // 2if start_y == None:start_y = (img_h - (font_h * row)) // 2end_x = start_x + font_wend_y = start_y + font_h * rowfor i, engStr in enumerate(engList):line_spacing = i * font_hcv2.rectangle(img, (start_x, start_y+line_spacing), (end_x, start_y+line_spacing+font_h), (0, 0, 0))cv2.putText(img, engStr, (start_x+gap, start_y+line_spacing+font_h-baseline-gap), cv2.FONT_HERSHEY_TRIPLEX, fontScale, (0, 0, 0), 1)return imgif __name__ == "__main__":img = np.ones([600, 1000, 3], dtype=np.uint8) * 188chnList = ['没有,不是,别乱说!', '产品型号|CCF| 符合标推| GB7251.3', '额定工作电压:220V/380V  额定工作电流', '额定绝缘电压:400V额定工作频率:50HZ', '出厂编号|| 出厂日期||年| |月', '河 南 西 西弗  电 气 有 限 公 司', 'abcdetfghidjkkdjddekdjieiij']img_pil = showChn4table_pil(img, chnList, 20, 5)cv2.imshow("img_pil", img_pil)engList = ["How old are you?", "How are you!", "How are you!", "Of course the longest string is me!", "How are you!", "How are you!", "hello,world!", "No, no, don't talk nonsense!"]img_cv = showEng4table_cv(img, engList, 0.8, 5)cv2.imshow("img_cv", img_cv)cv2.waitKey()

效果图片:

使用PIL

使用opencv

Python根据字体的大小获取字符串像素长度并以表格的形式在图片中显示相关推荐

  1. iOS 界面上绘制不同字体 颜色 大小的字符串

    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"绘制不同字体 颜色 ...

  2. 站长在线python精讲:在Python中使用len()函数计算字符串的长度详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用len()函数计算字符串的长度详解>.本知识点主要内容有:在Python中使用len()函数计算字符串在 ...

  3. C# 获取字符串长度 获取字符串字节长度

    获取字符串长度 string str = "ABCDadcf测试"; int l = str.Length; 获取字符串字节长度 public int ByteLength(str ...

  4. C语言 读取字符串数组中的字符串并获取字符串的长度

    #include <stdio.h> #define LENGTH 128 #define NUMBER 5int main(void){int i;char s[NUMBER][LENG ...

  5. php获取字符串商都_php strlen获取字符串字节长度和mb_strlen获取字符串个数长度的区别(strlen获取中文长度)...

    strlen获取字符串字节长度和mb_strlen获取字符串个数长度的区别,如果字符串是数字或者英文字母组成的话,它们2个的结果上体现不出区别,可是如果字符串是汉字组成的话它们2个的结果差异很大 重点 ...

  6. java中.length得到结果_Java length()方法:获取字符串的长度

    Java String中的 length() 方法用于获取字符串的长度,并以 in t型变量返回该字符串的长度. 语法: length(); 示例 使用 length() 函数获取字符串 strCom ...

  7. PHP中获取字符串的长度

    strlen() 如果执行成功则会返回字符串的长度,如果括号中为空值则返回0 <?php $str = 'abcdefghijk'; $len = strlen($str); echo $len ...

  8. php:获取字符串的长度

    获取字符串的长度 php中有一个神奇的函数,可以直接获取字符串的长度,这个函数就是strlen(). 例子如下: $str = 'hello'; $len = strlen($str); echo $ ...

  9. C# 获取字符串字节长度

    一.C# 获取字符串字节长度 1.在C# 语言中使用string 字符串Unicode 编码 2.在C#语言中常用汉字 占 3个字节 方式1:使用默认编码类获取字节长度 Console.WriteLi ...

最新文章

  1. 【Qt】Qt中调用python接口
  2. 如何检查Bash中是否设置了变量?
  3. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
  4. Linux而不必进入password登陆自己主动sshserver方法
  5. IOC操作Bean管理XML方式(注入集合类型属性)
  6. 先装vs还是先装sql_锅炉给水泵的止回阀到底安装在出口阀前还是阀后?
  7. 基于虚拟账号的邮件系统之×××
  8. Okhttp实用封装
  9. 太極:MIT华人学神开源的计算机图形库
  10. Redhat Enterprise Linux 5系统引导故障解决方法
  11. 网页现现实理服务器没有响应,前端_网页编程 HTTP协议(进阶)
  12. [译] 在 Twitch 代码直播一年的总结
  13. WiFi之协议栈要点
  14. 腾讯笔试题 微信红包
  15. Gartner到底怎么回事?
  16. 1.机器学习的重要性
  17. 【2021-07-15】JS逆向之网易云音乐(私信、关注、点赞)
  18. elasticsearch - 节点、集群分片及副本、CRUD
  19. NoSQL数据库的基础知识
  20. Py之pyod:pyod的简介、安装、使用方法之详细攻略

热门文章

  1. usb转com口驱动
  2. CPU-流水线的数据相关问题
  3. 立创开源 51编程炫酷心形流水灯
  4. P2P之UDP穿透NAT的原理与实现(附源代码)
  5. 计算机基础操作(计算机硬件知识)
  6. 云渲染测评,渲染100、扮家家、创意云哪个云渲染好用?
  7. 线下沙龙 | EOS入门及最新技术解读
  8. OPS and So on.
  9. ArduiNo(WeMos D1)基础(一)
  10. 30天打造专业红客四