昨日、蔵衛門を使って工事の写真の画像のサイズを一括で1280x960に変更する必要に迫られ、上司から紹介されたアプリを使ってみたらできなかった。上司も「あれ?おかしいな。」と言っていて他のアプリを探していたが、60個以上のリサイズをする場合、有料になるアプリを使おうとしていたので、自分で作ろうと思い、Pythonで画像サイズ一括変更アプリを作ってみた。
ChatGPTへの質問
『全ての画像の縦横サイズを任意の縦横サイズに一括で変更するプログラムをtkinterライブラリを用いてPythonで書いて。』
import os
from tkinter import Tk, filedialog, Label, Button, Entry # Entryを追加
from PIL import Image, ImageTk
class ImageResizer:
def __init__(self, root):
self.root = root
self.root.title("画像リサイズプログラム")
self.image_path = None
self.target_size = (0, 0)
self.label = Label(root, text="1. 画像を選択してください")
self.label.pack()
self.select_button = Button(root, text="画像を選択", command=self.choose_image)
self.select_button.pack()
self.label_size = Label(root, text="2. 新しいサイズを入力してください (幅 x 高さ):")
self.label_size.pack()
self.width_entry = Entry(root)
self.width_entry.pack()
self.height_entry = Entry(root)
self.height_entry.pack()
self.resize_button = Button(root, text="リサイズ", command=self.resize_images)
self.resize_button.pack()
def choose_image(self):
file_path = filedialog.askopenfilename(title="画像を選択", filetypes=[("Image files", "*.png;*.jpg;*.jpeg;*.gif")])
if file_path:
self.image_path = file_path
self.display_image()
def display_image(self):
image = Image.open(self.image_path)
image.thumbnail((300, 300)) # Resize image for display
photo = ImageTk.PhotoImage(image)
label_image = Label(self.root, image=photo)
label_image.image = photo
label_image.pack()
self.label.config(text="1. 画像を選択しました")
def resize_images(self):
if self.image_path:
try:
new_width = int(self.width_entry.get())
new_height = int(self.height_entry.get())
self.target_size = (new_width, new_height)
original_image = Image.open(self.image_path)
resized_image = original_image.resize(self.target_size, Image.ANTIALIAS)
save_path = self.save_resized_image(resized_image)
self.label.config(text=f"3. 画像をリサイズしました。
保存先: {save_path}")
except ValueError:
self.label.config(text="エラー: 正しい数値を入力してください。")
else:
self.label.config(text="エラー: 画像が選択されていません。")
def save_resized_image(self, image):
save_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
if save_path:
image.save(save_path)
return save_path
if __name__ == "__main__":
root = Tk()
app = ImageResizer(root)
root.mainloop()
画像があるディレクトリを選ぶ際にスマホでは変な状態になり、選択できなかった。
PCではどうなるだろうか?
→※PCで試してみたら成功。1280x960に変更できた。ただし、一個ずつしかリサイズできない。
これではファイルを一個ずつ選ぶ羽目になり、一括で変更できないかもしれない。
→※昨日、フォルダごとドラッグ&ドロップしてリサイズできないかどうかソースコードを変更してみたら…
次の記事に掲載予定。