Python制作带有GUI的照片动漫化程序


准备工作

这个项目调用的是百度AI开放平台照片动漫化接口,点击链接,注册并登录,选择“开放能力--图像技术--图像特效--人像动漫化”,点击立即使用,之后按提示操作即可获得API和password,个人用户可免费调用500次。

用到的包

import tkinter as tk
import tkinter.messagebox
from tkinter.filedialog import askopenfilename
import requests
import base64

获取照片路径

def selectPath():
    path_ = askopenfilename()
    path.set(path_)

调用接口

def get_access_token():
    url = 'https://aip.baidubce.com/oauth/2.0/token'
    data = {
        'grant_type':'client_credentials',
        'client_id':Api.get(),
        'client_secret':Password.get()
        }
    res = requests.post(url,data = data,headers = headers)
    res = res.json()
    access_token = res['access_token']
    return access_token

def img_process():
    try:
        img_before = path.get()
        img_after = img_before.split('.')
        img_after = img_after[0] + '_1.' + img_after[-1]
        request_url = 'https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime'
        file = open(img_before,'rb')
        origin_img = base64.b64encode(file.read())
    except:
        tk.messagebox.showerror('错误','请选择照片再执行!')
        return
    try:
        data = {
            'access_token':get_access_token(),
            'image':origin_img,
            'others':''
        }
    except:
        tk.messagebox.showerror('错误','Api可能已经失效或网络未连接!')
        return
    try:
        res = requests.post(request_url,data = data,headers = headers)
    except:
        tk.messagebox.showerror('错误','请检查网络连接是否正常')
        return
    if res.status_code == 200:
        try:
            res = res.json()
            f = open(img_after,'wb')
            after_img = res['image']
            after_img = base64.b64decode(after_img)
            f.write(after_img)
            f.close()
            tk.messagebox.showinfo('成功!','照片已经动漫化')
        except Exception as e:
            return
    else:
        tk.messagebox.showerror('错误','Api可能已经失效!')
        return

完整代码

import tkinter as tk
import tkinter.messagebox
from tkinter.filedialog import askopenfilename
import requests
import base64

window = tk.Tk()
window.title('照片动漫化')
window.geometry('250x200')

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
    }

def selectPath():
    path_ = askopenfilename()
    path.set(path_)

def get_access_token():
    url = 'https://aip.baidubce.com/oauth/2.0/token'
    data = {
        'grant_type':'client_credentials',
        'client_id':Api.get(),
        'client_secret':Password.get()
        }
    res = requests.post(url,data = data,headers = headers)
    res = res.json()
    access_token = res['access_token']
    return access_token

def img_process():
    try:
        img_before = path.get()
        img_after = img_before.split('.')
        img_after = img_after[0] + '_1.' + img_after[-1]
        request_url = 'https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime'
        file = open(img_before,'rb')
        origin_img = base64.b64encode(file.read())
    except:
        tk.messagebox.showerror('错误','请选择照片再执行!')
        return
    try:
        data = {
            'access_token':get_access_token(),
            'image':origin_img,
            'others':''
        }
    except:
        tk.messagebox.showerror('错误','Api可能已经失效或网络未连接!')
        return
    try:
        res = requests.post(request_url,data = data,headers = headers)
    except:
        tk.messagebox.showerror('错误','请检查网络连接是否正常')
        return
    if res.status_code == 200:
        try:
            res = res.json()
            f = open(img_after,'wb')
            after_img = res['image']
            after_img = base64.b64decode(after_img)
            f.write(after_img)
            f.close()
            tk.messagebox.showinfo('成功!','照片已经动漫化')
        except Exception as e:
            return
    else:
        tk.messagebox.showerror('错误','Api可能已经失效!')
        return

path = tk.StringVar()
entry_1 = tk.Entry(window,textvariable = path).place(x = 80,y = 90)
button_1 = tk.Button(window,text = '选择照片',command = selectPath)
button_1.place(x = 10,y = 90,height = 20)

Api = tk.StringVar()
entry_2 = tk.Entry(window,textvariable = Api,show = '*').place(x = 80,y = 30)
tk.Label(window,text = 'Api    :').place(x = 30,y = 30,height = 20)

Password = tk.StringVar()
entry_3 = tk.Entry(window,textvariable = Password,show = '*').place(x = 80,y = 60)
tk.Label(window,text = 'Password:').place(x = 10,y = 60,height = 20)

button_2 = tk.Button(window,text = '开始执行',command = img_process)
button_2.place(x = 75,y = 130,height = 50,width = 100)

if __name__ == '__main__':
    window.mainloop()

项目的打包

cmd下,切换到py文件保存目录,然后参考以下用法: pyinstaller -Fw xxx.py ps:建议在虚拟环境下打包,用到什么库就安装什么,不然打包出来体积会非常大