Python文字云生成:用“我爱你”拼出爱人照片的完整教程
本文详细介绍如何使用Python将普通照片转化为由“我爱你”等文字组成的艺术图片。通过OpenCV读取像素信息,结合PIL库在白色背景上逐块填充指定文字,并映射原图颜色值,最终生成独特的文字云效果。教程涵盖环境准备、核心代码逻辑及完整实现步骤,适合Python初学者尝试创意编程。
Python文字云生成:用“我爱你”拼出爱人照片的完整教程
摘要:每逢情人节或七夕节,许多人都面临一个经典难题——如何为伴侣准备一份别出心裁的节日惊喜。本文介绍一种新颖的表白方式:利用文字排列,将“我爱你”等字样组合成爱人的肖像图像。
每逢情人节或七夕节,许多人都面临一个经典难题——如何为伴侣准备一份别出心裁的节日惊喜。
若选择送花,朋友圈中满是类似祝福,伴侣可能评价:“缺乏创意!”;
若赠送实物礼物,若不合心意,伴侣可能表示:“你不懂我!”;
若选择逛街购物,面对空空的钱包,只能将此想法搁置……
今天,分享一种独特的表白方式——利用文字排列,将“我爱你”等字样组合成爱人的肖像图像!

成品展示图!

若看不清细节,可放大查看。

想要制作此类图片吗?现在开始操作。
准备工作与依赖库
一. 准备工作
伴侣的照片1张(建议清晰可爱)。
Python环境(本文使用Python 3.7)。
所需依赖库。
cv2:用于读取图片文件。
PIL:用于生成新图片。
性能较好的计算机。
(若未接触过Python,或不愿/无法配置环境、安装cv2和PIL库,或电脑性能不足,强烈建议使用华为云ModelArts进行开发,以直接解决环境配置和性能问题。)
基本实现思路
二. 基本思路 实现该效果需先获取一张照片,提取其像素信息,然后将这些颜色信息赋给由文字填充的新图片,即可得到如上图所示的效果。
接下来开始具体操作。
详细操作流程
三. 操作流程
1. 首先导入所需库(作用已在上述介绍中说明)。
from PIL import Image, ImageDraw, ImageFont
2. 声明绘图函数。
该函数包含两个参数:原图片路径和要写入的文字字符串。
def draw(pic, draw_text):
3. 读取图片数据。
使用cv2中的imread方法读取图片信息,
使用PIL中的Image方法创建新图片,尺寸与原图一致,背景设为白色。
blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white") drawObj = ImageDraw.Draw(blank) # 告知程序,接下来将在该图上绘制文字。
4. 声明绘图相关参数(经多次试验得出的最佳数值)。
m = 9 # 字体大小 font_path = '你使用字体的位置' # 字体文件路径 font = ImageFont.truetype(font_path, size=m) # 将字体信息赋值给font变量,供后续使用。
5. 最关键步骤:写入文字并根据源图片颜色进行填充。
通过两层for循环,依次定位每个文字所在的色块(中间间隔n是因为文字比像素块大得多,无法完全按每个像素位置和色彩排布)。
使用text()方法填入带色彩的文字,各参数含义如下:
[j, i] -- 坐标位置。
draw_text[int(j / n) % len(draw_text)] -- 确定当前应写入的文字(例如“我爱你”中的第几个字)。
fill=(img[i][j][2], img[i][j][1], img[i][j][0]) -- 代表源图片对应位置的颜色(三个值分别代表RGB颜色分量)。
for i in range(0, img.shape[0], n): for j in range(0, img.shape[1], n): drawObj.text( [j, i], draw_text[int(j / n) % len(draw_text)], fill=(img[i][j][2], img[i][j][1], img[i][j][0]), font=font ) # 按句子顺序填充文字。
6. 写入完成后,导出图片。
7. 调用封装好的函数。
输入图片路径和目标文字,运行程序,一张独一无二的表白图即生成。
draw('1.jpg', "我爱你")
附上完整代码(记得将字体路径修改为你电脑上的实际路径)。
from PIL
import Image, ImageDraw, ImageFont
def draw(pic, draw_text):
img = cv2.imread(pic)
blank = Image.new("RGB", [img.shape[1],
img.shape[0]
], "white")
drawObj = ImageDraw.Draw(blank)
n = 10
m = 9
font = ImageFont.truetype(font_path,
size = m)
for i in range(0, img.shape[0], n):
for j in range(0, img.shape[1], n):
drawObj.text(
[j, i],
draw_text[int(j / n) % len(draw_text)],
fill = (img[i][j][2], img[i][j][1],
img[i][j][0]),
font = font
)
blank.save('img_' + pic)
draw('1.jpg', "我爱你")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













