これは 身の回りの困りごとを楽しく解決! by Works Human Intelligence Advent Calendar 2025 の 24日目(クリスマスイヴ) の記事です。
こんにちは。
今回は、こちらのアドベントカレンダーの 「身の回りの困りごとを楽しく解決」 というテーマを見て、これだ!と思うものがあったので記事を書かせていただきます。
エンジニアとして、最新技術でバチバチに決まったモノを作るのも楽しいですが、手元の小さな不便を、パパっと小難しいことを考えずに解決することが楽しいと感じることもよくあります。
プログラミングを始めたばかりの動いたが面白いと感じていた初心を思い出すような感じです。
本記事では、日々の業務やプライベートで意外と発生する「画像のファイル形式変換(PNG⇔JPGなど)」を、Pythonを使って簡単シンプルに解決した話を共有します。
身の回りの地味なストレス
資料作成やフロントエンドの開発で、「HEIC画像のままだと表示できない」「PNGだと容量が大きすぎるのでJPGにしたい」という場面、よくありますよね。
そういう時、Googleで 「png jpg 変換」 と検索してしまいがちですよね。
そして、検索結果に出てくる無料の変換サイトを使っちゃいますよね。
あれらのサービスは便利ではあるのですが、使っていて気になることも多々あります。
- セキュリティへの懸念: これが一番大きいですね。業務に関わる画像を、所在の不明なサーバーにアップロードして良いものか
- 手間の多さ: ファイルを選択し、アップロードを待ち、変換を待ち、ダウンロードして
- 画質劣化の懸念: 実際にはどんな処理で変換しているのかわからないので、画質が無駄に劣化したり、破損したりなんてことはザラです
めんどくさがってついついブラウザでやっちゃおうとするのですが、よく考えれば私はエンジニア。
これぐらいのツールは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キーを押して終了してください...")
最後に
「車輪の再発明」は避けるべきとはよく言われますが、自分の手の届く範囲の困りごとを、自分で書いたコードで解決するというのは面白いものです。
自分で書いたコードならカスタマイズもし放題ですから、出力される文字列をアラビア語にしてみたり、ランダムで変換中にコードが人生について悩むようにしてみたり、いろいろできちゃいます。
普段何気なく行っている業務を見直してみると、これコード書いちゃった方がよくね?となることが意外とあるので、思い立ったが吉日ということで、パパっとコードを書いてみてください。