事实上,每一张图片都是由一个一个的像素点所组成的。
而每个像素点,都有自己的颜色,其颜色可以用一个数组来表示:(a,b,c),其中每位数的取值范围都是 0-255。
比如(0,0,0)代表黑色,(255,255,255)代表白色。
当像素点足够多的时候,这张照片就是我们所说的高清照片。
而如果当像素点太少,我们的肉眼就能感知到明显的锯齿感。
我只要每个像素取出一个像素值,并使用这个像素做为该字的颜色即可,在像素量够多的情况下,从远处看,是能看到我们原来图像的轮廓的。
例如:
#_*_coding:utf-8_*_
# @Author: VVcat
# @Time: 2020/2/14 0:38
# @File: Test.py
# @IDE: PyCharm
# @Email: [email protected]
# @Blog: vvcat.io
# @Version: 1.0
from PIL import Image, ImageDraw, ImageFont
font_size = 10 # 字体大小
text = "情人节快乐" # 写入文本
img_path = "D:/images/1.png" # 选择一张原图
# 首先,使用 pillow.Image读取图像,并使用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('D:/fonts/happy.ttf', font_size) # happy.ttf 为字体文件
# 由于需要不断循环 text中的字符文本。所以这里可以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://save.jpeg")