2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像の拡張子変換、まだWebサイトにアップロードしていますか? Pythonで安全・便利なツールを自作する

Last updated at Posted at 2025-12-23

これは 身の回りの困りごとを楽しく解決! by Works Human Intelligence Advent Calendar 202524日目(クリスマスイヴ) の記事です。

こんにちは。
今回は、こちらのアドベントカレンダーの 「身の回りの困りごとを楽しく解決」 というテーマを見て、これだ!と思うものがあったので記事を書かせていただきます。

エンジニアとして、最新技術でバチバチに決まったモノを作るのも楽しいですが、手元の小さな不便を、パパっと小難しいことを考えずに解決することが楽しいと感じることもよくあります。
プログラミングを始めたばかりの動いた面白いと感じていた初心を思い出すような感じです。

本記事では、日々の業務やプライベートで意外と発生する「画像のファイル形式変換(PNG⇔JPGなど)」を、Pythonを使って簡単シンプルに解決した話を共有します。

身の回りの地味なストレス

資料作成やフロントエンドの開発で、「HEIC画像のままだと表示できない」「PNGだと容量が大きすぎるのでJPGにしたい」という場面、よくありますよね。

そういう時、Googleで 「png jpg 変換」 と検索してしまいがちですよね。
そして、検索結果に出てくる無料の変換サイトを使っちゃいますよね。

あれらのサービスは便利ではあるのですが、使っていて気になることも多々あります。

  1. セキュリティへの懸念: これが一番大きいですね。業務に関わる画像を、所在の不明なサーバーにアップロードして良いものか
  2. 手間の多さ: ファイルを選択し、アップロードを待ち、変換を待ち、ダウンロードして
  3. 画質劣化の懸念: 実際にはどんな処理で変換しているのかわからないので、画質が無駄に劣化したり、破損したりなんてことはザラです

めんどくさがってついついブラウザでやっちゃおうとするのですが、よく考えれば私はエンジニア。
これぐらいのツールはPythonでチャチャっと作っちゃえばよいのです。

自分専用の変換ツールを作る

要件とするのは以下の3点。

  • 安全: ローカル環境で完結し、外部にデータを出さないこと
  • 手軽: D&Dで変換できること
  • 高速: 複数ファイルの一括変換ができること

使用するのは、Pythonの画像処理ライブラリとして定番の Pillow (PIL) です。

Step 1: 準備

まずはライブラリをインストールします。

pip install Pillow

Step 2: 基本の変換コード

ただ同じディレクトリにある画像をpng⇒jpgにするだけならこれだけでできます。

from PIL import Image

img = Image.open('target.png')
img = img.convert('RGB')
img.save('output.jpg', quality=85)

これだけでも機能はしますが、毎回ファイル名をtarget.pngにしなきゃいけなかったり、同じディレクトリ限定だったりと不便です。

Step 3: 実用的な一括変換スクリプト

D&Dしたファイルの拡張子をpngからjpgに変換しつつ、
複数ファイルに対応し、変換時によくあるトラブル(透過PNGをJPGにすると背景が真っ黒になる問題)にも対処します。
また、ファイル名の処理にはpathlibを使います。

import sys
from pathlib import Path
from PIL import Image

if __name__ == "__main__":
    # D&Dされたファイルのリストを取得
    dropped_files = sys.argv[1:]

    if not dropped_files:
        print("画像が見つかりません")
        input("\nEnterキーを押して終了...")
        sys.exit()

    print(f"{len(dropped_files)} 件のファイルを処理します...")
    print("-" * 30)

    for file_path in dropped_files:
        try:
            input_file = Path(file_path)

            with Image.open(input_file) as img:
                # RGBモードに変換(JPGは透過非対応のためアルファチャンネルを削除)
                if img.mode in ("RGBA", "P"):
                    img = img.convert("RGB")

                # 元のファイル名から拡張子のみ変更
                output_file = input_file.with_suffix(".jpg")

                img.save(output_file, "JPEG", quality=95)
                print(f"[成功] {input_file.name} -> {output_file.name}")

        except Exception as e:
            # 1つ失敗しても止まらず次へ進む
            print(f"[エラー] {file_path}")
            print(f"詳細: {e}")

    print("-" * 30)
    input("すべての処理が完了しました。Enterキーを押して終了してください...")

最後に

「車輪の再発明」は避けるべきとはよく言われますが、自分の手の届く範囲の困りごとを、自分で書いたコードで解決するというのは面白いものです。
自分で書いたコードならカスタマイズもし放題ですから、出力される文字列をアラビア語にしてみたり、ランダムで変換中にコードが人生について悩むようにしてみたり、いろいろできちゃいます。
普段何気なく行っている業務を見直してみると、これコード書いちゃった方がよくね?となることが意外とあるので、思い立ったが吉日ということで、パパっとコードを書いてみてください。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?