Vico 发表于 2024-1-13 17:23:31

Python 通过tkinter实现图片风格的转换

本帖最后由 Vico 于 2024-1-13 17:30 编辑

本应用功能:

[*]使用Python做一个图片风格处理的应用
[*]tkinter做软件界面,
[*]有按钮打开本地的图片
[*]另外有一个按钮,将图片的风格改成黑白图
[*]显示在软件中,与原图做对比


效果如下:



代码如下:
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

# 打开图像文件
def open_image():
    global img, img_display, img_styled, img_display_styled
    file_path = filedialog.askopenfilename()# 打开文件对话框
    if file_path:
      img = Image.open(file_path)
      img = resize_image(img)
      img_display = ImageTk.PhotoImage(img)
      panel_original.config(image=img_display)# 在原始图像面板上显示图像
      # 当打开新图像时清除已应用风格的图像面板
      panel_styled.config(image='')

# 应用风格转换
def apply_style():
    global img, img_styled, img_display_styled
    if img is None:
      return
    img_styled = style_transfer(img)
    img_display_styled = ImageTk.PhotoImage(img_styled)
    panel_styled.config(image=img_display_styled)# 在应用风格的图像面板上显示图像

# 风格转换函数
def style_transfer(image):
    # 应用预定义风格到图像
    # 这是实际风格转换函数的占位符
    return image.convert("L")# 示例:将图像转换为灰度

# 调整图像大小
def resize_image(image):
    original_width, original_height = image.size
    aspect_ratio = original_height / original_width# 宽高比
    new_height = int(400 * aspect_ratio)# 按照宽高比调整新高度
    new_size = (400, new_height)
    # 使用 Image.Resampling.LANCZOS 以获得更高质量的缩小图像
    return image.resize(new_size, Image.Resampling.LANCZOS)

# 创建主窗口
root = tk.Tk()
root.title("图像风格转换器")# 窗口标题
root.geometry("1000x800")# 设置窗口大小为 1000x800

# 初始化全局变量用于图像及其显示
img = None
img_styled = None

# 创建面板来显示原始图像和已应用风格的图像
panel_original = tk.Label(root, borderwidth=2, relief="groove")
panel_original.pack(side="left", padx=10, pady=10, fill="both", expand=True)

panel_styled = tk.Label(root, borderwidth=2, relief="groove")
panel_styled.pack(side="right", padx=10, pady=10, fill="both", expand=True)

# 创建一个按钮用于打开图像
btn_open = tk.Button(root, text="打开图像", command=open_image)
btn_open.pack(side="top", pady=5)

# 创建一个按钮用于应用风格转换
btn_style = tk.Button(root, text="应用风格", command=apply_style)
btn_style.pack(side="top", pady=5)

# 运行应用程序
root.mainloop()

其中风格可以定义如下:
在Pillow库中,image.convert() 方法通常用于改变图像的模式,而不是直接应用艺术风格。例如,image.convert("L") 将彩色图像转换为灰度图像。下面列出了一些常用的模式转换参数:

"L":将图像转换为灰度(8位像素,黑白)。
"RGB":将图像转换为真彩色(3x8位像素,红绿蓝)。
"RGBA":将图像转换为真彩色带透明度掩膜(4x8位像素,红绿蓝透明度)。
"CMYK":将图像转换为分色印刷颜色模式(4x8位像素,青色品红黄色黑色)。
"1":将图像转换为二值图像(1位像素,黑白,使用阈值)

页: [1]
查看完整版本: Python 通过tkinter实现图片风格的转换