前久看到了微博上的表白图,就是柯南那个,感觉好炫酷,有点好玩,于是这几天在CSDN上搜了搜,果真有大神分享。于是照着弄了一下,加了一丢丢自己大胆的想法。
参考博文链接:(ps:表示感谢)
其实步骤还是挺简洁易懂的:
-
首先,用PIL的Image函数读取图片
-
接着,新建一张图(尺寸和原图一样)
-
然后,在新建的图象上用PIL的ImageDraw把字给画上去,字的颜色从原图处获取。
-
先贴一张我弄的鬼刀壁纸,文字素材:西游记,哈哈哈哈哈,别问为什么是西游记,这里不开花/xyx
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fe7d74ff84e168fd889a789eea3a3dc2.jpeg)
== 【放大看看效果吧】 ==
接下来上代码
from PIL import Image, ImageDraw, ImageFont
import os.path as op
import re
import os
class C_pic():
def __init__(self, img_path, font_size=9, m=1, out_dir='', text='我喜欢你', del_punctuation=True):
if not op.exists(img_path):
os.makedirs(img_path)
self.font_size = font_size
self.del_punctuation = del_punctuation
self.raw_img = Image.open(img_path)
self.img_raw = self.raw_img.resize((int(self.raw_img.size[0]*m), int(self.raw_img.size[1]*m)))
self.img_array = self.img_raw.load()
self.new_img = Image.new('RGB', self.img_raw.size, (60, 63, 65))
self.font = ImageFont.truetype(r'c:\windows\fonts\simsun.ttc', font_size)
self.draw = ImageDraw.Draw(self.new_img)
self.img_id = int(abs(hash(img_path))**0.5)
self.out_path = op.join(out_dir, str(self.img_id)+'.jpeg')
if op.isfile(text):
self.get_txt(text)
else:
self.text = text
def character_generator(self):
while 1:
for i in range(len(self.text)):
yield self.text[i]
def get_txt(self, t_path):
pt = re.compile(r'[ 一二三七十\u3000,。、\n\\=+(){【\-…·~!@#¥%】} ""\'??/‘“:;;&*……%¥”’]')
with open(t_path, 'r+', encoding='utf8') as f:
tt = f.read()
if self.del_punctuation:
tt = pt.sub('', tt)
self.text = tt
f.close()
return tt
def start_mk(self):
ch_gen = self.character_generator()
for y in range(0, self.img_raw.size[1], self.font_size):
for x in range(0, self.img_raw.size[0], self.font_size):
self.draw.text((x, y), next(ch_gen), font=self.font, fill=self.img_array[x, y], direction=None)
print(f'\rmade__{y}__//___{self.img_raw.size[1]-y}__', end='')
else:
self.new_img.convert('RGB').save(self.out_path, quality=95)
self.new_img.show()
return f'\nmade it!\nFile_path: {self.out_path}'
if __name__ == '__main__':
img_path = r'c:\users\....\gd.png'
text1 = r'c:\users\....\ttw.txt'
text = '啦啦啦呀'
out_dir = r'c:\users\....\...\...'
font_size = 11
one = C_pic(font_size=font_size, out_dir=out_dir, img_path=img_path, text=text1, m=1.1)
print(one.start_mk())
这里,创建了一个类方法C_pic(),那么要搞图的话,只需要两步,初始化,还有调用开始绘制的函数。关于这个类初始化,以及一些参数,这里稍微梳理一下。
C_pic(img_path, font_size=9, m=1, out_dir=’’, text=‘我喜欢你’, del_punctuation=True) |
---|
参数 | 说明 |
---|
img_path | 原图片地址 |
font_size | 绘图字体的大小,默认9,建议大于7 |
m | 图像的放大倍数,可为浮点数。(当图像较小,字小了看不清,大了效果差的话,可以适当放大图像,然后就可以适当放大字体大小) |
out_dir | 输出文件目录,可以不存在,不设置的话图像会默认保存在当前路径 |
text | 文本源,可以为文本文件路径。默认为:‘我喜欢你’ |
del_punctuation | 值为True时删除文档中的标点等,默认为True |
最后,有需要现成《西游记》文本的话,链接在这->《西游记》文本 【自我吐槽:西游记这么香吗?哈哈哈哈】
如果需要其它文本的话,评论告诉我,我尽量找,哈哈哈哈。
[这么好玩的东西,光用来表白多没劲,就不可以有大胆的想法吗?[此处有一滑稽[不小心套娃了,哈哈哈]],比如…你可以试试多大一张图用font_size=10可以写完西游记,哈哈哈哈,岂不是比表白更有意思]
读到这里的话,其实上一段是废话,哈哈哈。脱单趁早,祝早日脱单!