直接上代码
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 圖像的引用,以便在保存圖像時使用。