コードを直接上げる
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 画像への参照を保持し、画像を保存する際に使用します。