直接上代码
from PIL import Image, ImageDraw, ImageTk
import tkinter as tk
from tkinter import filedialog
def convert_to_circle(image_path):
# 打开图片并转换为RGBA模式
image = Image.open(image_path).convert("RGBA")
# 创建一个与图片大小相同的透明背景图像
circle_image = Image.new('RGBA', image.size, (0, 0, 0, 0))
# 创建一个画笔
draw = ImageDraw.Draw(circle_image)
# 画一个圆形
draw.ellipse((0, 0, image.size[0], image.size[1]), fill=(255, 255, 255, 255))
# 将原始图片应用到遮罩上
circle_image.paste(image, (0, 0), mask=circle_image)
# 返回圆形边缘图像
return circle_image
def select_image():
# 打开文件对话框,选择图片文件
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
# 如果选择了图片文件,则进行转换并显示在程序中
if file_path:
circle_image = convert_to_circle(file_path)
circle_image.thumbnail((300, 300)) # 缩小图像以适应显示区域
photo = ImageTk.PhotoImage(circle_image) # 将图像转换为PhotoImage对象
image_label.configure(image=photo)
image_label.image = photo # 保持对图像的引用
image_label.circle_image = circle_image # 保存原始的PIL图像
def save_image():
# 获取当前显示的图像
circle_image = image_label.circle_image
# 如果有图像,则保存为文件
if circle_image:
save_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
if save_path:
circle_image.save(save_path)
print("头像已保存为:", save_path)
# 创建主窗口
window = tk.Tk()
window.title("圆形头像转换")
window.geometry("400x400")
# 创建选择按钮
select_button = tk.Button(window, text="选择图片", command=select_image)
select_button.pack(pady=10)
# 创建图像显示区域
image_label = tk.Label(window)
image_label.pack()
# 创建保存按钮
save_button = tk.Button(window, text="保存图像", command=save_image)
save_button.pack(pady=10)
# 运行主循环
window.mainloop()
首先,我们导入了所需的库。PIL 库用于图像处理,tkinter 库用于创建 GUI 界面。
接下来,我们定义了一个名为 convert_to_circle 的函数,用于将选择的图片转换为圆形图像。这个函数接受一个图片路径作为参数,并返回处理后的圆形图像。
在 convert_to_circle 函数中,我们首先打开图片并将其转换为 RGBA 模式。然后,创建一个与原始图片大小相同的透明背景图像。接着,创建一个画笔对象,并使用它绘制一个圆形,圆形的位置和大小与原始图片相同,填充颜色为白色。最后,将原始图片应用到透明背景图像上,使用透明背景图像作为遮罩。最终,返回处理后的圆形图像。
接下来,我们定义了一个名为 select_image 的函数,用于选择图片文件并将其转换为圆形图像。在这个函数中,我们打开文件对话框,选择图片文件,并获取选择的文件路径。如果选择了图片文件,则调用 convert_to_circle 函数将图片转换为圆形图像。然后,将图像缩小以适应显示区域,并将其显示在程序中的图像标签上。
最后,我们定义了一个名为 save_image 的函数,用于保存当前显示的圆形图像为文件。在这个函数中,我们获取当前显示的圆形图像,并打开文件对话框选择保存路径。如果选择了保存路径,则将图像保存为文件。
在主程序中,我们创建了一个主窗口,并设置窗口的标题和大小。然后,创建了一个选择按钮,点击按钮时调用 select_image 函数。接着,创建了一个用于显示图像的标签。最后,创建了一个保存按钮,点击按钮时调用 save_image 函数。
最后,通过运行主循环启动应用程序,等待用户的交互操作。
代码中使用了 PIL 库(Python Imaging Library)来处理图像,以及 tkinter 库来创建图形用户界面。它通过将图像转换为 PhotoImage 对象,并将其赋值给图像显示区域的 image 属性,来显示图像。同时,它还保持了对原始 PIL 图像的引用,以便在保存图像时使用。