見出し画像

【python】フォルダ内の画像を一括で圧縮する方法

画像を一括で圧縮する良い感じのツールがなく、chatgptに聞いたらpythonでできるとのことだったので作ってもらいました。

なお、プログラミングに関してはド素人です。
chatgptに聞いたコードをそのまま使ったらうまくいっただけなので、動かす場合は自己責任でお願いします。

pythonの環境構築

まずpythonを動かす環境が必要です。
私はVScodeでjupyter notebookを使っています。
詳しく書くと長くなってしまうので、具体的な解説は別の方の記事を貼っておきます。

VScodeでpythonを使う方法はこちらの記事がわかりやすかったです。

jupyter notebookは拡張機能をインストールすれば使えます。

画像を一括で圧縮するコード

あとはjupyter notebookを新しく作成して、以下のコードを実行するだけです。

拡張子をPNGのまま、JPEGで圧縮していたので、クリスタなどの画像編集ソフトで取り込めないようになっていました。
そのため保存時に拡張子もJPGにするよう変更しました。

import os
from PIL import Image

def compress_images_in_folder(input_folder, output_folder, quality):
    """
    フォルダ内の画像を一括で圧縮する関数
    :param input_folder: 入力画像フォルダのパス
    :param output_folder: 出力画像フォルダのパス
    :param quality: 圧縮品質(0〜100の範囲、100が最高品質)
    """
    # 出力フォルダが存在しない場合は作成
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 入力フォルダ内のファイルを処理
    for filename in os.listdir(input_folder):
        if filename.endswith(('.jpg', '.jpeg', '.png', '.bmp')):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            compress_image(input_path, output_path, quality)

def compress_image(input_path, output_path, quality):
    """
    JPEG画像の容量を圧縮する関数
    :param input_path: 入力画像ファイルのパス
    :param output_path: 出力画像ファイルのパス
    :param quality: 圧縮品質(0〜100の範囲、100が最高品質)
    """
    with Image.open(input_path) as img:
        img = img.convert('RGB')
        output_path = os.path.join(output_folder, os.path.splitext(os.path.basename(input_path))[0] + '.jpg')
        img.save(output_path, format='JPEG', quality=quality)

# 入力フォルダと出力フォルダを指定
input_folder = r'ここに画像が入ったフォルダのパス'
output_folder = r'ここに出力先のパス'
# 圧縮品質(0〜100、100が最高品質)
compression_quality = 75

# 画像を一括で圧縮して保存
compress_images_in_folder(input_folder, output_folder, compression_quality)

分かる部分の解説

ライブラリ
こちらはosとPILというライブラリを使って画像を圧縮するコードです。
osは、ファイルやディレクトリの作成、削除、移動ができるもの。
PILは、Pythonで画像処理を行えるもの。

img = img.convert('RGB')
画像が「RBGA」だとうまく動かなかったため、chatgptに聞いたらRGBに変換してから行うようにコードを修正してくれました。
なお、RGBAのAはアルファ値で透過機能のことです。
ですので、このコードで圧縮するとPNGの透過機能は失われます。

自分で指定が必要な部分
フォルダと圧縮品質は自分で指定する必要があります。
圧縮品質が75でいい方はそのままでも大丈夫です。

入力フォルダと出力フォルダを指定
input_folder = r'ここに画像が入ったフォルダのパス'
output_folder = r'ここに出力先のパス'
圧縮品質(0〜100、100が最高品質)
compression_quality = 75

フォルダはinput_folderに画像が入ったフォルダ、output_folderが出力先です。
「'(アポストロフィ)」の間に入力してください。

input_folder = r'C:\sample'
output_folder = r'C:\sample\resize'   

なお、input・outputフォルダを同じにすると上書きされるので注意してください。

・圧縮品質
compression_qualityの数値を変えることで圧縮後の画像品質を指定できます。
デフォルトで75にしてありますが、0~100で指定可能です。
4k画像を75で処理すると以下のような感じです。
※左が圧縮前・右が圧縮後

ちなみに圧縮サイズは7.4MB→704KBと約1/10になりました。

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