zoukankan      html  css  js  c++  java
  • 用Python做一个520表白神器,值得收藏

    本文最后给出了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用。

    先来看一下具体的效果。

    运行程序。

    点击「选择图片」 选择JPG/JPGE/PNG三种中任意一种格式的图片,然后点击生成表白图片则可。这里还要注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!

    比如我选择了一张「进击的巨人」图片,其生成效果如下。

    将图片放大看看,会发现图片全部由「我喜欢你!」构成。

    编码时刻

    我们知道图片由不同的像素组成,每个像素都有自己的颜色,通过RGB来表示,如图。

    (图出自 easyai)

    RGB本身就是一个数组:(a,b,c),数组中的每一位的取值范围都是0~255,比如黑色可以通过(0,0,0)来表示。

    我只需要将图片中每个像素的RGB值都取出,并使用这个RGB值作为字体的颜色则可,这样生成的图片从远处来看依旧会是原本图像的轮廓。

    有了具体的思路,就可以编写代码了。完整代码在文末,这里先看关键代码片段理解思路。

    在Python中可以通过PIL来实现对图片的各种操作。

    首先安装一下PIL。

    pip install pillow
    复制代码

    PIL消极维护,一群爱好者fork了PIL的代码,并在其之上进行维护与修改,fork后的代码项目称为pillow。

    首先,通过PIL.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('SimHei.ttf', font_size)
    复制代码

    最后就是循环img_raw并将图像像素数组对应的值赋值给字体,作为字体的颜色。

    for y in range(0, img_raw.size[1], font_size):
        for x in range(0, img_raw.size[0], font_size):
            # 绘制文字并赋值颜色,具体为fill参数
            draw.text((x, y), next(ch_gen), font=font, fill=img_array[x, y], direction=None)
    复制代码

    至此大功告成。

    是否可以再优化一下?

    为了让没有编程经验的朋友可以轻松使用,我决定用tkinter做一个简陋的界面,再使用pyinstaller进行打包,让各位无需安装Python环境与PIL,直接开箱即用。

    tkinter是Python内置的桌面应用框架,相比于PyQT5,它更加轻便,但功能也更加简陋,但用于开发表白神器已经足够了,tkinter内置于Python,不行安装,直接使用。

    这里同样给出部分代码,完整代码看文末。

    首先创建一个界面。

    self.window = window
    self.window.title('表白神器')
    self.window.geometry('300x200')
    menubar = Menu(self.window)
    复制代码

    然后定义两个按钮与对应的响应方法。

    # 选择图片
    btn1 = Button(window, text='选择图片', width=15, height=2, command=self.get_img)
    btn1.pack()
    
    # 生成图片
    self.send_btn = Button(window, text='生成表白图片', width=15, height=2, command=self.gen_img)
    self.send_btn.pack()
    复制代码

    当点击选择图片按钮时,get_img方法会被调用,具体代码如下。

    def get_img(self):
       global IMGPATH
       # 选择文件
       filenames = askopenfilenames(filetypes=(("jpeg img", "*.jpeg"), ("jpg img", "*.jpg"), ("png img", "*.png")))
       if len(filenames) > 0:
           fnlist = [fn for fn in filenames]
           fnstr = '
    '.join(fnlist)
           self.l.config(text=fnstr) # 显示选择了什么文件
           IMGPATH = fnlist
       else:
           self.l.config(text='目前没有选择任何图片文件')
    复制代码

    上述代码中,get_img方法通过tkinter的askopenfilenames方法打开系统的文件选择框,通过filetypes参数指定可以选择的文件类型,最终该方法会返回该文件完整的文件路径。

    点击生成图片时,会调用gen_img方法,该方法就是调用前面编写好生成图像的方法,不再赘述。

    最后

    为了方便他人使用,我通过pyinstaller将表白程序打包。windows下的朋友可以直接下载,然后解压使用,找到压缩文件中的loveyou.exe,双击运行则可使用。

    注意:表白图片会生成在loveyou.exe的相同目录下。

    都懂了吗?最后注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!

    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

  • 相关阅读:
    java 构建一个简单的菜单
    java JSplitPane
    java 使用ActionListener监控
    java 显示单选按钮
    工作 激情
    明天会更好
    记录
    现在
    嘿嘿
    书籍 知识
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12745242.html
Copyright © 2011-2022 走看看