【Python】tkinterで画像圧縮ツールを作ってみた

プログラミング
広告
広告
広告

皆さんこんにちは!

画像がたくさんあると、容量が気になってしまいますよね。そんな時に便利なのが、画像圧縮ツールです。

今回ご紹介するツールは、GUI付きで操作が簡単なだけでなく、フォルダごと圧縮できるので、たくさんの画像をまとめて処理したい方にもおすすめです。

また、コードを実際に動かしてみるとPythonの勉強になるので活用していただければと思います。

広告
広告
広告

ツールの概要

  • フォルダごと画像を圧縮
  • 圧縮率を自由に設定
  • 圧縮後の画像を別のフォルダに保存
  • 進捗状況をバー表示で確認可能

ライブラリインストール

以下のコマンドを実行して、Pillowライブラリをインストールします。
Pillowライブラリについて詳しく知りたい方は公式ドキュメントを参照してください。

pip install pillow

コード一覧

以下にコード一覧を載せます。

import os
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter.ttk import Progressbar
from PIL import Image

class ImageCompressorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("画像圧縮ツール")
        self.root.geometry("400x200")  # ウィンドウサイズを変更

        self.selected_folder = tk.StringVar()

        # 参照フォルダ選択
        self.folder_frame = tk.Frame(root)
        self.folder_frame.pack(pady=10)

        self.folder_label = tk.Entry(self.folder_frame, textvariable=self.selected_folder)
        self.folder_label.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)

        self.select_folder_button = tk.Button(self.folder_frame, text="参照", command=self.select_folder)
        self.select_folder_button.pack(side=tk.RIGHT, padx=5)

        # テキストボックスの幅を広げる
        self.folder_label.config(width=30)

        # リサイズパーセンテージ入力
        self.resize_label = tk.Label(root, text="リサイズパーセンテージ(%):")
        self.resize_label.pack()
        self.resize_entry = tk.Entry(root)
        self.resize_entry.pack()

        # 圧縮実行ボタン
        self.compress_button = tk.Button(root, text="圧縮開始", command=self.compress_images)
        self.compress_button.pack(pady=10)

        # 進捗バー
        self.progress = Progressbar(root, orient="horizontal", length=200, mode="determinate")
        self.progress.pack(pady=10)

    def select_folder(self):
        folder_path = filedialog.askdirectory()
        if folder_path:
            self.selected_folder.set(folder_path)

    def compress_images(self):
        folder_path = self.selected_folder.get()
        if not folder_path:
            messagebox.showerror("エラー", "フォルダが選択されていません。")
            return
        try:
            resize_percentage = float(self.resize_entry.get())
            compressed_folder = os.path.join(folder_path, "圧縮画像")
            if not os.path.exists(compressed_folder):
                os.makedirs(compressed_folder)
            image_files = [filename for filename in os.listdir(folder_path)
                           if filename.endswith((".jpg", ".png"))]
            num_images = len(image_files)
            self.progress["maximum"] = num_images
            for index, filename in enumerate(image_files, start=1):
                image_path = os.path.join(folder_path, filename)
                with Image.open(image_path) as img:
                    width, height = img.size
                    new_width = int(width * (resize_percentage / 100))
                    new_height = int(height * (resize_percentage / 100))
                    resized_img = img.resize((new_width, new_height))
                    output_path = os.path.join(compressed_folder, filename)
                    resized_img.save(output_path)
                self.progress["value"] = index
                self.root.update_idletasks()
            messagebox.showinfo("完了", "画像の圧縮が完了しました。")
        except Exception as e:
            messagebox.showerror("エラー", f"エラーが発生しました: {str(e)}")

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

※コードの利用は注意してご使用ください。

使用例

このコードを実行すると以下のような初期画面がでます。

「参照」ボタンから画像が格納されているフォルダを選択してください。
その後、「リサイズパーセンテージ」に1~100の数値を入力してください。(圧縮値の入力)

準備できましたら「圧縮開始」ボタンを押して処理を実行してください。
進捗バー表示され、バーが一番右まで到達すると完了のメッセージがでます。

実行完了しましたら選択したフォルダの直下に「圧縮画像」というフォルダができます。
フォルダの中にリサイズされた画像が同じ名前で格納されています。

最後に

今回作成したコードとexeは下記リンク先に保存しています。
ファイル名は「image_compressor.py」です。
また、exeファイルも作成しているのでダウンロードしたい方は下記リンクから右にある「Releases」を選択し、目的のexeファイルをダウンロードしてください。

GitHub - technyanko/python_tools
Contribute to technyanko/python_tools development by creating an account on GitHub.
人気ブログランキング

クリックするとブログランキングサイトに移動します。

にほんブログ村 IT技術ブログへ
インターネット・コンピュータランキング
広告
プログラミング
広告
広告
technyankoをフォローする
広告
広告
プロフィール
technyanko

元情シス・SEです。
当ブログではPCに関して困ったことや役立つ情報を発信していきます。
たまにバッチスクリプトやPythonに関する記事も投稿します。

technyankoをフォローする
広告
タイトルとURLをコピーしました