Python PIL库 表白/搞图 用‘我爱你‘写出你的样子

前久看到了微博上的表白图,就是柯南那个,感觉好炫酷,有点好玩,于是这几天在CSDN上搜了搜,果真有大神分享。于是照着弄了一下,加了一丢丢自己大胆的想法。

参考博文链接:(ps:表示感谢)
博主:王一白- 《情人节来了,教你个用 Python 表白的技巧》
其实步骤还是挺简洁易懂的:
  • 首先,用PIL的Image函数读取图片

  • 接着,新建一张图(尺寸和原图一样)

  • 然后,在新建的图象上用PIL的ImageDraw把字给画上去,字的颜色从原图处获取。

  • 先贴一张我弄的鬼刀壁纸,文字素材:西游记,哈哈哈哈哈,别问为什么是西游记,这里不开花/xyx

在这里插入图片描述

== 【放大看看效果吧】 ==

接下来上代码

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) # 根据图片地址的哈希值随便弄个id来当文件名吧
        self.out_path = op.join(out_dir, str(self.img_id)+'.jpeg')
        if op.isfile(text):
        	#判断传入的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可以写完西游记,哈哈哈哈,岂不是比表白更有意思]

读到这里的话,其实上一段是废话,哈哈哈。脱单趁早,祝早日脱单!

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的壳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值