🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【コピペでOK】Pythonで画像の一括リサイズ!Web制作者のためのPillow入門

こんにちは!数ヶ月前までプログラミング知識ゼロだった私が、AIの力を借りながらWebサイトを立ち上げた経験を元に、初心者目線で解説するシリーズです。

Webサイトを運営していると、必ずと言っていいほど発生するのが「画像のリサイズ」。ブログ記事のサムネイル、商品画像、ポートフォリオ用の作品… 大量の画像を一枚一枚手作業でリサイズするのは、正直言って心が折れそうになりますよね。私もそうでした。

でも、安心してください。Pythonを使えば、そんな面倒な作業をたった数秒で自動化できてしまうんです!この記事では、プログラミング初心者の方でもコピペするだけで、すぐに使える「画像一括リサイズツール」の作り方を、私のつまずきポイントも交えながら丁寧に解説します。「動いた!」という感動を、ぜひあなたも体験してみてください。


今回のゴール:面倒な画像リサイズを自動化しよう!

この記事を最後まで読めば、あなたはこんなPythonスクリプトを作れるようになります。

例えば、フォルダに溜まった数十枚の写真を、一瞬でブログ用の横幅800pxの画像に変換する、といったことが可能になります。もう、画像編集ソフトを何度も開く必要はありません!

リサイズ前後の画像比較。左側には元の大きな写真が複数枚あり、右側にはPythonプログラムによって一括でリサイズされた小さな画像が複数枚並んでいる様子。

手作業とはおさらば!Pythonで一括処理したイメージ


準備編:Pillowのインストールと作業フォルダの用意

魔法の呪文を唱える前に、まずは下準備から始めましょう。難しくないので安心してくださいね。

1. Pillowって何? どうやってインストールするの?

今回使用する主役が「Pillow(ピロー)」というライブラリです。ライブラリとは、便利な機能をまとめた「道具箱」のようなもの。Pillowは、Pythonで画像を扱うための、いわば「画像処理の達人道具箱」です。

Pillowは世界中の多くの開発者に使われている、非常に信頼性の高いライブラリです。公式サイトにも豊富なドキュメントがあり、安心して利用できます。(参考:Pillow 公式ドキュメント

インストールは、コマンドプロンプト(Windows)やターミナル(Mac)で以下の1行を実行するだけです。

pip install Pillow

2. 作業フォルダを準備しよう

次に、作業用のフォルダを準備します。これがとても重要!ごちゃごちゃにならないように、リサイズ前の画像を入れるフォルダと、リサイズ後の画像を保存するフォルダを分けておきましょう。

デスクトップなど、好きな場所にまず「resize_tool」という名前のフォルダを作成してください。そして、その中に以下の3つを用意します。

  1. input_images フォルダ: リサイズしたい元の画像を入れておく場所です。
  2. output_images フォルダ: リサイズ後の画像が保存される場所です。
  3. resize.py: これから私たちが書くPythonのコードファイルです。

こんな感じの構成になります。

resize_tool/
├── input_images/
│   ├── photo1.jpg
│   ├── photo2.png
│   └── ... (ここにリサイズしたい画像を入れる)
├── output_images/
│   └── (ここは最初は空っぽ)
└── resize.py (このファイルを作成する)

準備はこれだけです! `input_images` フォルダに、お手持ちの画像をいくつか入れておいてくださいね。


実践編:Pythonコードを書いていこう!

いよいよコーディングです! `resize.py` ファイルをテキストエディタで開いて、一緒に書いていきましょう。一つ一つの処理を分解して説明するので、焦らずついてきてください。

ステップ1:必要な道具(モジュール)を準備する

まず、プログラムの最初に「今回はこれらの道具を使いますよ」という宣言をします。画像処理の達人「Pillow」と、フォルダやファイルを扱う達人「os」を呼び出しましょう。

import os
from PIL import Image

from PIL import Image は、「Pillowライブラリ(PIL)の中から、特に画像(Image)を扱う機能を使います」という意味です。お決まりの呪文だと思ってください。


ステップ2:フォルダの場所を教える

次に、先ほど用意した「入力フォルダ」と「出力フォルダ」がどこにあるのかを、プログラムに教える必要があります。

# 入力フォルダと出力フォルダのパスを指定
input_dir = 'input_images'
output_dir = 'output_images'

これで、プログラムは `input_images` から画像を読み込み、処理結果を `output_images` に書き出せば良いんだな、と理解してくれます。


ステップ3:画像を1枚リサイズしてみる(基本の処理)

いきなり全部やろうとすると混乱するので、まずは「たった1枚の画像」をリサイズする処理の流れを見てみましょう。これが全ての基本になります。

  1. 画像を開く (`Image.open`)
  2. 新しいサイズにリサイズする (`.resize`)
  3. 新しい名前で保存する (`.save`)

コードにすると、こんなイメージです。(※このコードはまだ実行しません)

# (これはあくまでイメージです)
# 1. 画像を開く
img = Image.open('input_images/photo1.jpg')

# 2. 横幅800pxにリサイズする (高さは適当)
resized_img = img.resize((800, 600))

# 3. 別名で保存する
resized_img.save('output_images/resized_photo1.jpg')

ステップ4:入力フォルダの全画像を順番に処理する

基本がわかったら、いよいよ本題です。`input_images` フォルダの中にあるファイルを、Pythonに一つずつ取り出してもらい、順番にリサイズ処理をかけていきましょう。こういう「繰り返し処理」は、プログラミングの得意技です。

`os.listdir(input_dir)` を使うと、指定したフォルダの中にあるファイル名のリストを取得できます。これを使って、ファイルが一つもなくなるまで処理を繰り返します。

# 入力フォルダ内の全てのファイルに対して処理を繰り返す
for filename in os.listdir(input_dir):
    # ここに、各ファイルに対するリサイズ処理を書いていく
    print(f"{filename}を処理中...")

for ... in ...: というのが、繰り返し処理を行うための構文です。 `os.listdir(input_dir)` で取得したファイル名のリストから、ファイル名を1つずつ `filename` という変数に入れて、ブロック内の処理を実行してくれます。


【最重要】私がハマった落とし穴と解決策

順調に進んでいるように見えますが、実はここに初心者がハマりやすい落とし穴があります。私も見事にハマりました!

問題:画像ファイル以外も処理しようとしてエラーになる!

Macを使っていると `.DS_Store` という不可視ファイルが自動で生成されたり、自分でメモ用のテキストファイルを入れたりすることがあります。先ほどのコードは、フォルダ内の「全て」のファイルを処理しようとするため、画像ではないファイルを開こうとしてエラーになってしまうのです。

解決策:画像ファイル(.jpg, .pngなど)だけを処理対象にする

ファイル名の末尾(拡張子)をチェックして、それが画像形式の場合だけリサイズ処理を行うように条件分岐を追加します。これでエラーを確実に防げます。

for filename in os.listdir(input_dir):
    # ファイルの拡張子が .jpg, .jpeg, .png のいずれかであるかチェック
    if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')):
        # ここにリサイズ処理を書けば、画像ファイルのみが対象になる!
        print(f"画像ファイル {filename} を処理します。")
    else:
        # 画像ファイルでなければスキップする
        print(f"画像ではないファイル {filename} をスキップします。")
        continue # ループの次の回へ進む

.lower()でファイル名を小文字に変換してから、.endswith()で末尾の文字列をチェックするのがポイントです。こうすることで、`PHOTO.JPG` のように大文字の拡張子にも対応できます。


応用編①:アスペクト比を保ったまま美しくリサイズ

さて、リサイズの基本は分かりましたが、ただ単にサイズを指定すると、画像が縦や横に伸びて不格好になってしまいます。Webサイトの品質を保つ上で、アスペクト比(縦横比)の維持は必須です!

計算は簡単。元の画像の縦横比を算出し、新しい横幅に合わせて高さを自動で計算すれば良いのです。

  1. 目標の横幅を決める (例: 800px)
  2. 元の画像のサイズ(幅と高さ)を取得する
  3. 元の高さ / 元の幅 で縦横比を計算する
  4. 新しい高さ = 目標の横幅 * 縦横比 で、新しい高さを割り出す

これをコードに落とし込むと、以下のようになります。

# (ループ処理の中に入れるコードです)

# 元の画像を開く
img = Image.open(os.path.join(input_dir, filename))
width, height = img.size # 元の画像の幅と高さを取得

# 新しい横幅を指定
new_width = 800
# 縦横比を維持したまま新しい高さを計算
new_height = int(new_width * height / width)

# リサイズ実行!
resized_img = img.resize((new_width, new_height))

os.path.join() を使うと、フォルダ名とファイル名をOSに合わせて正しく連結してくれるので安全です。また、計算結果は小数点になる可能性があるので `int()` で整数に変換しています。


応用編②:Web制作者向け!画像に「透かし」を入れてみよう

自分の作品やブログの画像を無断で使われないように、「透かし(ウォーターマーク)」を入れたい時もありますよね。Pillowなら、そんな処理も簡単です。リサイズ後の画像に、著作権表記などのテキストを書き加えてみましょう。

これにはPillowの描画機能 `ImageDraw` を使います。

# (リサイズ後の処理です)
from PIL import ImageDraw, ImageFont

# ... リサイズ処理の後 ...

# 描画オブジェクトを作成
draw = ImageDraw.Draw(resized_img)

# テキストとフォントを指定
text = "© Your Name"
# フォントはPCに入っているものを指定できます。ない場合は標準フォントが使われます。
try:
    font = ImageFont.truetype("arial.ttf", 24)
except IOError:
    font = ImageFont.load_default()

# テキストを描画する位置を計算(右下)
text_width, text_height = draw.textbbox((0, 0), text, font=font)[2:4]
position = (resized_img.width - text_width - 10, resized_img.height - text_height - 10)

# テキストを描画
draw.text(position, text, font=font, fill=(255, 255, 255, 128)) # 半透明の白

# この後、画像を保存する

少し複雑に見えますが、やっていることは「描画モードにして」「テキストと位置を決めて」「書き込む」という流れです。fill=(255, 255, 255, 128) の最後の `128` は透明度を表しており、0(完全透明)から255(完全不透明)の間で調整できます。


【AI活用術】このコード、AIにどう頼めば作れる?

私がプログラミングを学ぶ上で欠かせなかったのが、ChatGPTやGeminiといったAIの存在です。彼らにうまく指示(プロンプト)を出せば、今回のようなコードは一瞬で生成してくれます。

例えば、こんな風にお願いしてみてください。

PythonのPillowライブラリを使って、画像を一括でリサイズするスクリプトを作成してください。 # 要件 - `input_images` という名前のフォルダから画像を読み込む。 - 読み込むファイルは `.jpg`, `.jpeg`, `.png` のみとする。 - 全ての画像を、アスペクト比を維持したまま、横幅が800pxになるようにリサイズする。 - リサイズした画像は、`output_images` という名前のフォルダに、元のファイル名で保存する。 - 処理中のファイル名がわかるように、コンソールにメッセージを表示してほしい。

ポイントは、やりたいことを具体的かつ箇条書きで明確に伝えることです。AIは優秀なアシスタントなので、指示が正確であればあるほど、精度の高いコードを返してくれますよ。


総まとめ:コピペで動く!画像一括リサイズツールの全コード

お待たせしました!これまで解説してきた全ての要素を組み合わせた、完成版のPythonスクリプトです。これを `resize.py` にコピペして、`input_images` フォルダに画像をいくつか入れてから実行してみてください。

実行は、コマンドプロンプトやターミナルで `resize_tool` フォルダに移動し、`python resize.py` と入力するだけです。

import os
from PIL import Image

def resize_images_in_folder(input_dir, output_dir, new_width=800):
    """
    指定されたフォルダ内の画像を、アスペクト比を維持して一括リサイズする関数
    
    :param input_dir: 入力フォルダのパス
    :param output_dir: 出力フォルダのパス
    :param new_width: リサイズ後の画像の横幅 (ピクセル)
    """
    # 出力フォルダが存在しない場合は作成する
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"フォルダ '{output_dir}' を作成しました。")

    # サポートする画像拡張子のリスト
    supported_formats = ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff')

    # 入力フォルダ内の全てのファイルを取得
    filenames = os.listdir(input_dir)
    
    if not filenames:
        print(f"入力フォルダ '{input_dir}' にはファイルがありません。")
        return

    print(f"処理を開始します... 対象ファイル数: {len(filenames)}")

    # 各ファイルを処理
    for filename in filenames:
        # 拡張子がサポートされている形式かチェック
        if not filename.lower().endswith(supported_formats):
            print(f"--- スキップ: {filename} (非対応ファイル)")
            continue

        try:
            # 入力パスと出力パスを作成
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, filename)

            # 画像を開く
            with Image.open(input_path) as img:
                # 元の画像の幅と高さを取得
                width, height = img.size
                
                # アスペクト比を維持したまま新しい高さを計算
                aspect_ratio = height / width
                new_height = int(new_width * aspect_ratio)

                # 画像をリサイズ
                resized_img = img.resize((new_width, new_height))
                
                # 画像を保存(PNGの場合は透過を維持)
                if filename.lower().endswith('.png'):
                    resized_img.save(output_path, 'PNG')
                else:
                    # JPEGで保存する場合、品質を指定できます (デフォルトは75)
                    # RGBに変換しないとエラーになる場合があるため変換
                    resized_img.convert('RGB').save(output_path, 'JPEG', quality=90)

                print(f"✓ 成功: {filename} を {new_width}x{new_height} にリサイズしました。")

        except Exception as e:
            print(f"× エラー: {filename} の処理中に問題が発生しました - {e}")

    print("全ての処理が完了しました。")

# --- ここからがプログラムの実行部分 ---
if __name__ == "__main__":
    # 入力フォルダと出力フォルダのパスを指定
    INPUT_FOLDER = 'input_images'
    OUTPUT_FOLDER = 'output_images'
    
    # リサイズ後の目標の横幅を指定
    TARGET_WIDTH = 800

    # 関数を実行
    resize_images_in_folder(INPUT_FOLDER, OUTPUT_FOLDER, TARGET_WIDTH)

`output_images` フォルダを開いてみてください。リサイズされた画像がずらっと並んでいれば大成功です!


さいごに:プログラミングは「面倒」を解決する魔法

今回は、PythonとPillowを使って、退屈な画像リサイズ作業を自動化するツールを作りました。プログラミングと聞くと難しく感じるかもしれませんが、このように「身の回りの面倒なことを解決する」という目的を持つと、一気に楽しく、そして実用的なスキルになります。

この記事が、あなたの「できた!」という成功体験に繋がり、プログラミングの世界への第一歩となれば、これほど嬉しいことはありません。ぜひ、いろいろな設定を試して、あなただけのツールに改造してみてくださいね!


次のステップへ

この記事でPythonの便利さを体験したあなたは、きっと次のステップに進みたくなるはずです。次は、外部のサービスと連携して、もっと面白いことをしてみませんか?

以下の記事では、Web APIを使って天気予報を取得するコマンドラインアプリの作り方を解説しています。今日学んだ知識を活かして、さらなるスキルアップを目指しましょう!

Pythonで天気情報を取得するCLIアプリ(API活用)