获取原图的像素以及每个像素点的颜色,然后循环一行一行的来写"武汉加油!"。每个字的颜色用原图里面相应像素点的颜色来填充,只要原图像素够高(行数和列数足够多),还是能看出原图的轮廓,而当你放大的时候就会发现"武汉加油!中国加油!"藏在里面。
原图:
效果图:
程序源代码:
from PIL import Image, ImageDraw, ImageFont
font_size = 6
text = "武汉加油!"
img_path = "D://dailylife//Pictures//0.jpg"
//读取图像,并使用load函数获取每一个像素值
img_raw = Image.open(img_path)
img_array = img_raw.load()
//新建画布,确定字体和字体大小
img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
draw = ImageDraw.Draw(img_new)
font = ImageFont.truetype('C:/Windows/fonts/Dengl.ttf', font_size)
//while循环 yield 来实现一个生成器
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
ch_gen = character_generator(text)
//给字加上相应的颜色,写入新创建的画布中
for y in range(0, img_raw.size[1], font_size):
for x in range(0, img_raw.size[0], font_size):
draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
//保存图片
img_new.convert('RGB').save("D://1.jpg")
从结果可以看出,上面的大字效果还可以,但下面稍小的字体就看不出来了,需要改变font_size 的值。当把此值设置为2时就非常清晰了,但也有一个问题,红色的背景此时并不是红色了。