如何使用Python结合OpenCV或Pillow为图片添加不同角度的文字?
如何为图片添加不同角度的文字(以120°的"Hello World"为例)
下面分别用Pillow和OpenCV两种常用工具实现需求:
一、使用Pillow实现
Pillow可以通过生成旋转后的文字图像,再将其粘贴到原图的方式实现角度文字添加:
from PIL import Image, ImageDraw, ImageFont # 1. 加载原图 img = Image.open("input.jpg") draw = ImageDraw.Draw(img) # 2. 设置字体(请替换为你的字体文件路径,比如系统字体路径) font = ImageFont.truetype("arial.ttf", 40) # 字体大小40 # 3. 定义要添加的文字和旋转角度 text = "Hello World" rotate_angle = 120 # 4. 创建单独的文字图像,用于旋转 text_img = Image.new("RGBA", draw.textbbox((0,0), text, font=font)[2:], (255,255,255,0)) text_draw = ImageDraw.Draw(text_img) text_draw.text((0,0), text, font=font, fill=(255,0,0,255)) # 红色文字 # 5. 旋转文字图像(expand=True确保图像完整容纳旋转后的内容) rotated_text = text_img.rotate(rotate_angle, expand=True) # 6. 将旋转后的文字粘贴到原图(这里选择左上角偏移(50,50)的位置,可自行调整) img.paste(rotated_text, (50,50), rotated_text) # 7. 保存结果 img.save("output_pillow.jpg")
二、使用OpenCV实现
OpenCV没有直接旋转文字的API,需要先在空白画布上绘制文字,再旋转画布,最后叠加到原图:
import cv2 import numpy as np # 1. 加载原图 img = cv2.imread("input.jpg") img_height, img_width = img.shape[:2] # 2. 设置文字参数 text = "Hello World" font = cv2.FONT_HERSHEY_SIMPLEX font_scale = 1.5 font_color = (0,0,255) # BGR格式,红色 thickness = 2 rotate_angle = 120 # 3. 计算文字尺寸,创建对应大小的空白画布 (text_width, text_height), _ = cv2.getTextSize(text, font, font_scale, thickness) text_canvas = np.zeros((text_height + 20, text_width + 20, 3), dtype=np.uint8) # 预留边缘 # 4. 在空白画布上绘制文字 cv2.putText(text_canvas, text, (10, text_height + 5), font, font_scale, font_color, thickness) # 5. 获取旋转矩阵,旋转文字画布 center = (text_canvas.shape[1]//2, text_canvas.shape[0]//2) rotation_matrix = cv2.getRotationMatrix2D(center, rotate_angle, 1.0) rotated_text = cv2.warpAffine(text_canvas, rotation_matrix, (text_canvas.shape[1], text_canvas.shape[0])) # 6. 将旋转后的文字画布叠加到原图(这里选择坐标(50,50)作为左上角) x, y = 50, 50 roi = img[y:y+rotated_text.shape[0], x:x+rotated_text.shape[1]] # 处理透明区域(这里通过阈值提取文字掩码) gray = cv2.cvtColor(rotated_text, cv2.COLOR_BGR2GRAY) _, mask = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY_INV) roi = cv2.bitwise_and(roi, roi, mask=mask) roi = cv2.add(roi, rotated_text) img[y:y+rotated_text.shape[0], x:x+rotated_text.shape[1]] = roi # 7. 保存结果 cv2.imwrite("output_opencv.jpg", img)
内容的提问来源于stack exchange,提问作者Naveen raj
相关产品推荐
相关产品推荐

