每到情人节或特殊纪念日,如何送出与众不同的惊喜往往是个难题。送花容易撞款,礼物难猜心意,不如尝试用代码创作一幅独一无二的作品——用文字拼贴出爱人的模样。


成品效果就是这样,由文字组成的图像。放大看细节,每个像素点其实都是一段文字。

准备工作
要实现这个效果,你需要以下基础环境:
- 一张照片:最好是清晰的人像或风景照。
- Python 环境:建议使用 Python 3.7 及以上版本。
- 依赖库:
cv2(OpenCV):用于读取图片像素信息。PIL(Pillow):用于绘图和生成新图片。
- 一台性能尚可的电脑:处理图片需要一定的计算资源。
注意:如果你不熟悉环境配置,或者担心本地运行效率问题,也可以考虑使用云端开发环境,但本地调试通常更灵活。
核心思路
原理并不复杂:读取原图的每一个像素点的颜色值,然后在一个新的空白画布上,按照相同的坐标位置填入文字,并将文字的颜色设置为对应像素的颜色。通过控制文字的密度(间隔),就能在视觉上还原出原图的轮廓。
代码实现
首先导入必要的库。这里我们封装了一个 draw 函数,方便重复调用。
import cv2
from PIL import Image, ImageDraw, ImageFont
def draw(pic, draw_text):
# 读取原图,cv2 默认为 BGR 格式
img = cv2.imread(pic)
# 创建与源图尺寸一致的白色背景画布
blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
drawObj = ImageDraw.Draw(blank)
# 设置参数:n 为文字间隔,m 为字体大小
n = 10
m =
font_path =
font = ImageFont.truetype(font_path, size=m)
i (, img.shape[], n):
j (, img.shape[], n):
char = draw_text[(j / n) % (draw_text)]
color = (img[i][j][], img[i][j][], img[i][j][])
drawObj.text([j, i], char, fill=color, font=font)
blank.save( + pic)

