原图:
处理过的:
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import os# 字体文件路径
vfont = './fonts/方正像素字体.ttf'def text_paint(img_path, text, font_path, font_size):# 使用 OpenCV 加载图片img = cv2.imread(img_path)if img is None:raise Exception("无法加载图片,请检查图片路径是否正确")# 放大图片为原来的2倍img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2), interpolation=cv2.INTER_LINEAR)# 检查字体文件是否存在try:if os.path.exists(font_path):font = ImageFont.truetype(font_path, font_size)else:font = ImageFont.truetype(vfont, font_size)except Exception as e:print(f"加载字体失败: {e}")font = ImageFont.load_default()# 获取文字的实际大小test_text = textbbox = font.getbbox(test_text)char_width = bbox[2] - bbox[0]char_height = bbox[3] - bbox[1]# 创建一个新的白底图片(2倍大小)new_img = Image.new('RGB', (img.shape[1], img.shape[0]), 'white')draw = ImageDraw.Draw(new_img)# 遍历图片的每个字符位置,使用实际字符大小for y in range(0, img.shape[0], char_height):for x in range(0, img.shape[1], char_width):# 获取当前区域的平均颜色if y < img.shape[0] and x < img.shape[1]:# 计算区域范围y_end = min(y + char_height, img.shape[0])x_end = min(x + char_width, img.shape[1])# 获取区域的平均颜色region = img[y:y_end, x:x_end]avg_color = np.mean(region, axis=(0, 1))color = tuple(map(int, avg_color[::-1])) # BGR转RGB并转为整数# 用平均颜色绘制文字draw.text((x, y), text, font=font, fill=color)# 保存和显示图片new_img.save('output.jpg')new_img.show()# 使用示例
text_paint('./2.png', 'a', vfont, 8)
功能解析
- 图片加载和放大:首先使用OpenCV加载图片,如果图片不存在则抛出异常。然后将图片放大到原来的两倍,以便在更大的画布上绘制。
- 字体加载:检查指定的字体文件是否存在,如果不存在则使用备用字体。
- 文字大小获取:获取指定文字的实际大小,以便确定在图片上绘制文字的间隔。
- 新图片创建:创建一个新的白色背景图片,大小为原图片的两倍。
- 颜色计算和文字绘制:遍历图片的每个区域,计算该区域的平均颜色,并用这种颜色在新图片上绘制文字。
- 图片保存和显示:最后,将处理后的图片保存并显示。
这个函数可以用于各种创意项目,例如生成艺术效果的图片或者进行视觉设计实验。