びゅーわ

import tkinter as tk
from tkinter import filedialog, Scale
from tkinter import ttk
from PIL import Image, ImageTk, ImageEnhance
import boto3
import numpy as np
from io import BytesIO
import matplotlib.pyplot as plt

class ImageViewer:
   def __init__(self, root):
       # ルートウィンドウの設定
       self.root = root
       self.root.title("S3 Image Viewer")

       # キャンバスの設定
       self.canvas = tk.Canvas(root, width=800, height=600)
       self.canvas.pack()

       # 下部にボタンとスライダーのフレームを作成
       self.frame = tk.Frame(root)
       self.frame.pack(side=tk.BOTTOM)

       # 画像を開くボタンの作成
       self.open_button = tk.Button(self.frame, text="Open", command=self.open_image)
       self.open_button.pack(side=tk.LEFT)

       # 画像を保存するボタンの作成
       self.save_button = tk.Button(self.frame, text="Save", command=self.save_image)
       self.save_button.pack(side=tk.LEFT)

       # モード選択ラジオボタンの作成
       self.mode_var = tk.StringVar(value="RGB")
       self.rgb_radio = tk.Radiobutton(self.frame, text="RGB", variable=self.mode_var, value="RGB", command=self.update_image)
       self.rgb_radio.pack(side=tk.LEFT)

       self.grayscale_radio = tk.Radiobutton(self.frame, text="Grayscale", variable=self.mode_var, value="Grayscale", command=self.update_image)
       self.grayscale_radio.pack(side=tk.LEFT)

       # RGBスライダーの作成
       self.r_scale = Scale(self.frame, from_=0, to=255, orient=tk.HORIZONTAL, label="R", command=self.update_image)
       self.r_scale.pack(side=tk.LEFT)
       
       self.g_scale = Scale(self.frame, from_=0, to=255, orient=tk.HORIZONTAL, label="G", command=self.update_image)
       self.g_scale.pack(side=tk.LEFT)
       
       self.b_scale = Scale(self.frame, from_=0, to=255, orient=tk.HORIZONTAL, label="B", command=self.update_image)
       self.b_scale.pack(side=tk.LEFT)

       # 画像変数の初期化
       self.image = None
       self.display_image = None

       # S3クライアントの設定
       self.s3 = boto3.client('s3')
       self.bucket_name = 'your-bucket-name'  # ここにあなたのS3バケット名を設定してください

   def open_image(self):
       # S3から画像を選択するためのファイルダイアログを開く
       filename = filedialog.askopenfilename()
       if filename:
           with open(filename, 'rb') as f:
               self.image = Image.open(f)
               self.display_image = self.image
               self.show_image()

   def save_image(self):
       # 現在表示されている画像をS3に保存
       if self.display_image:
           output = BytesIO()
           self.display_image.save(output, format='JPEG')
           output.seek(0)
           self.s3.upload_fileobj(output, self.bucket_name, 'saved_image.jpg')
           print("Image saved to S3.")

   def update_image(self, event=None):
       # 表示モードに応じて画像を更新
       if self.image:
           if self.mode_var.get() == "Grayscale":
               self.display_image = self.image.convert('L')
           else:
               r = self.r_scale.get()
               g = self.g_scale.get()
               b = self.b_scale.get()
               rgb_image = np.array(self.image)
               rgb_image = rgb_image * [r/255.0, g/255.0, b/255.0]
               self.display_image = Image.fromarray(np.uint8(rgb_image))

           self.show_image()

   def show_image(self):
       # キャンバスに画像を表示
       if self.display_image:
           img_width, img_height = self.display_image.size
           canvas_width, canvas_height = self.canvas.winfo_width(), self.canvas.winfo_height()
           scale = min(canvas_width / img_width, canvas_height / img_height)
           img_width, img_height = int(img_width * scale), int(img_height * scale)
           self.display_image = self.display_image.resize((img_width, img_height), Image.ANTIALIAS)

           self.tk_image = ImageTk.PhotoImage(self.display_image)
           self.canvas.create_image(canvas_width//2, canvas_height//2, image=self.tk_image)

if __name__ == "__main__":
   root = tk.Tk()
   app = ImageViewer(root)
   root.mainloop()

この記事が気に入ったらサポートをしてみませんか?