前段时间在微博上面看到一个比较有趣的图片,点开过后是这个样子的
看着照片上面密密麻麻的小点瞬间激起了我的好奇心,打开放大一看,咦……很有意思鸭,哈哈哈……应该是博主想要表达爱意,但是对于害羞的男生来说,确实当面还不好意思说出口,这样花式表白,应该还能增进几分成功率!
分享一下用Python怎么做这样的图片,先讲一下原理,事实上,每一张图片都是由一个一个的像素点所组成的。而每个像素点,都有自己的颜色,其颜色可以用一个数组来表示:(a,b,c),其中每位数的取值范围都是 0-255。
比如(0,0,0)代表黑色,(255,255,255)代表白色。
当像素点足够多的时候,这张照片就是我们所说的高清照片。
而如果当像素点太少,我们的肉眼就能感知到明显的锯齿感。
用 Excel 画了个图,每一方格代表一个像素,其中若我的字体的大小设置 5(非字号5,而是每个字占用5个像素),效果大概就是如下这样子。
我只要每个像素取出一个像素值,并使用这个像素做为该字的颜色即可,在像素量够多的情况下,从远处看,是能看到我们原来图像的轮廓的。
有了思路,就可以开始我们的代码。
首先,使用 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('E://字体文件/字体文件/00/方正吕建德行楷.ttf' , font_size)
由于需要不断循环 “我喜欢你!”,这五个字符。所以这里可以while循环 yield 来实现一个生成器。
def character_generator(text):
while True:
for i in range(len(text)):
yield text[i]
最后,要给这些字加上相应的颜色,写入新创建的画布中。
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("F://save.jpg")
完整代码如下:
from PIL import Image, ImageDraw,ImageFont
font_size = 8
text = "我喜欢你"
img_path = "E://ceshi.jpg"
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('E://字体文件/字体文件/00/方正吕建德行楷.ttf' , font_size)
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("F://save.jpg")
希望大家脱单成功——这样就可以来使用情侣恋爱时光了,哈哈哈……情侣恋爱时光-记录幸福生活www.99uwen.com