本帖最后由 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位像素,黑白,使用阈值)
复制代码
|