• 情人节后属于单身狗的浪漫


    👦👦一个帅气的boy,你可以叫我Love And Program
    🖱 ⌨个人主页:Love And Program的个人主页
    💖💖如果对你有帮助的话希望三连💨💨支持一下博主

    在这里插入图片描述

    前言

           七夕节,想给未来女朋友发一个小心心,你还是向下面一样,单纯的发一个爱你咩,大直男!
    请添加图片描述

    文字替换图片内容

           首先用PIL库获取到图片:

    img_raw = Image.open(img_path)
    
    • 1

           然后需要获取图片中每个像素点的RGB值,需要执行对象的load()方法读取数据,为后续文字效果fill填充做准备:

    draw = ImageDraw.Draw(img_new)
    
    • 1

           然后我们选择SimHei.ttf字体,这个可以显示中文字符(选其他的也可以),并设定文字大小:

    font = ImageFont.truetype(font='SimHei.ttf',size=font_size, encoding="utf-8")
    
    • 1

           然后生成文字,我们每间隔一段打印一个文字,直至到输入图片尺寸的边界:

    # 生成字体
        i = 0
        for y in range(0, img_raw.size[1], font_size):
            for x in range(0, img_raw.size[0], font_size):
                # 为字体赋值相应的颜色
                if i < text_len:
                    draw.text((int(x), int(y)), text=text[i] ,font=font ,fill=img[int(x), int(y)], direction=None)
                    i += 1
                else:
                    i = 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

           最后保存图片:

    save_img = img_new.convert('RGB')
    save_img.save(savepath)
    
    • 1
    • 2

    biaobai.py代码

           第一个py全部代码:

    # biaobai.py
    from PIL import Image, ImageDraw, ImageFont
    
    def baiobai_progrom(img_path, savepath):
        '''生成文字拼接而成的图片'''
        font_size = 15
        text = "我爱你!"
        text_len = len(text)
        img_raw = Image.open(img_path)
        img = img_raw.load()
        img_new = Image.new("RGB", img_raw.size, (0, 0, 0))
        draw = ImageDraw.Draw(img_new)
        font = ImageFont.truetype(font='SimHei.ttf',size=font_size, encoding="utf-8")
        # 生成字体
        i = 0
        for y in range(0, img_raw.size[1], font_size):
            for x in range(0, img_raw.size[0], font_size):
                # 为字体赋值相应的颜色
                if i < text_len:
                    draw.text((int(x), int(y)), text=text[i] ,font=font ,fill=img[int(x), int(y)], direction=None)
                    i += 1
                else:
                    i = 0
        save_img = img_new.convert('RGB')
        save_img.save(savepath)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    GUI界面

           主要程序已经写完了,我们来设计一个小界面:

    def __init__(self, window,Img_path):
            self.window = window
            self.Img_path = Img_path
            self.window.title('我爱你!!!')
            self.window.geometry('521x521')# 1314
    
            # 显示
            self.display = Label(window, text='')
            self.display.pack(padx=10, pady=15)  # 固定窗口位置
            # 选择图片
            btn = Button(window, text='选择表白图片', width=30, height=2, command=self.get_img)
            btn.pack()
            # 生成图片
            self.send_btn = Button(window, text='点此生成你的表白图片', width=30, height=2, command=self.gen_img)
            self.send_btn.pack()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    正常界面为下图:
    在这里插入图片描述
    选择图片后为:
    在这里插入图片描述

           我们接下来实现图片文件的自由选择,选择图片输入格式jpeg,jpg,png三种格式,主要代码为:

    def get_img(self):
            # 选择图片格式
            filenames = askopenfilenames(filetypes=(("jpeg img", "*.jpeg"), ("jpg img", "*.jpg"), ("png img", "*.png")))
            if len(filenames) > 0:
                fnlist = [fn for fn in filenames]
                self.display.config(text='已选择文件')
                self.Img_path = fnlist
            else:
                self.display.config(text='请选择图片文件')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    最后当然是调用生成文字的函数啦:

        def end_img(self):
            for imgpath in self.Img_path:
                Filepath,Filename = os.path.split(imgpath)
                Filename,Extension = os.path.splitext(Filename)
                savepath =  f'爱你宝贝{Extension}'
                baiobai_progrom(imgpath, savepath)
            showinfo('转换成功!','我爱你(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    成功转换后提示你转换成功:
    在这里插入图片描述

    最后效果图如下:
    请添加图片描述


    aini_program.py代码

    # aini_program.py gui部分代码
    import os
    from tkinter import Tk, Menu, Label, Button
    from tkinter.messagebox import showinfo
    from tkinter.filedialog import askopenfilenames
    from biaobai import baiobai_progrom
    class GUI_Design(object):
        def __init__(self, window,Img_path):
            self.window = window
            self.Img_path = Img_path
            self.window.title('我爱你!!!')
            self.window.geometry('521x521')# 1314
    
            # 显示
            self.display = Label(window, text='')
            self.display.pack(padx=10, pady=15)  # 固定窗口位置
            # 选择图片
            btn = Button(window, text='选择表白图片', width=30, height=2, command=self.get_img)
            btn.pack()
            # 生成图片
            self.send_btn = Button(window, text='点此生成你的表白图片', width=30, height=2, command=self.gen_img)
            self.send_btn.pack()
        def get_img(self):
            # 选择图片格式
            filenames = askopenfilenames(filetypes=(("jpeg img", "*.jpeg"), ("jpg img", "*.jpg"), ("png img", "*.png")))
            if len(filenames) > 0:
                fnlist = [fn for fn in filenames]
                self.display.config(text='已选择文件')
                self.Img_path = fnlist
            else:
                self.display.config(text='请选择图片文件')
    
        def gen_img(self):
            for imgpath in self.Img_path:
                Filepath,Filename = os.path.split(imgpath)
                Filename,Extension = os.path.splitext(Filename)
                savepath =  f'爱你宝贝{Extension}'
                baiobai_progrom(imgpath, savepath)
            showinfo('转换成功!','我爱你(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤')
    
    if __name__ == '__main__':
        Img_path = ''
        window = Tk()
        GUI_Design(window,Img_path)
        window.mainloop()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    3.程序控制
    Centos7 ELK 8.2 集群配置
    自适应神经网络算法原理,单神经元自适应控制
    78-基于STM32单片机的DDS函数信号波形发生器(实物图+源码+原理图+PCB+论文)全套资料
    terminal下环境不统一导致的程序报错(powersell改cmd)
    用两个栈实现队列
    聚苯乙烯-SiO2/NiFe2O4磁性微球/中空介孔载银二氧化硅聚苯乙烯微球制备过程
    Hadoop大数据通用处理平台
    GoLang连接mysql数据库
    超详细讲解Redis基础类型String增删改查及加减数据(带Java库源码)
  • 原文地址:https://blog.csdn.net/qq_43604989/article/details/126167935