びゅーわ
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()
この記事が気に入ったらサポートをしてみませんか?