こんにちは、Tech Samuraiです!
iPhoneで撮影した綺麗な写真をPCに移してブログで使おうとしたら、「このファイル形式はサポートされていません」というエラーが出て困ったことはありませんか?
これは、近年のiPhoneの標準画像フォーマットである**HEIC(ヒーフ)形式**が、Windowsや一部のWebサービスでまだ標準サポートされていないために起こる問題です。HEICは高画質・高圧縮で優れた形式なのですが、まだまだJPEG形式の方が汎用性が高いのが現実です。
今回のプロジェクトでは、この問題を一気に解決する、**「指定したフォルダ内のHEIC画像を、全てJPEGに一括変換する」**という、超便利なPythonツールを開発します。Pythonの画像処理ライブラリの王様**`Pillow`**とその拡張機能を使い、面倒な変換作業を自動化しましょう!
ステップ1:準備 – 必要なライブラリを揃える
Pythonの画像処理ライブラリである`Pillow`は、標準ではHEIC形式を読み書きできません。そこで、`Pillow`にHEICの読み書き能力を追加してくれる`pillow-heif`というヘルパーライブラリも一緒にインストールします。
Ryeを使ったモダンな環境で、プロジェクトを準備しましょう。
# 1. プロジェクトフォルダを作成して移動
mkdir heic-converter
cd heic-converter
# 2. Ryeプロジェクトを初期化
rye init
# 3. 必要なライブラリを追加
rye add pillow pillow-heif
ステップ2:HEIC画像変換スクリプトの全コード
それでは、ツール本体のコードです。`convert.py`などの名前で保存してください。コードの各ブロックが何をしているのか、この後で詳しく解説します。
import os
import sys
from pathlib import Path
from PIL import Image
import pillow_heif
def convert_heic_to_jpeg(source_dir, output_dir):
"""
指定されたディレクトリ内のHEIC画像をJPEGに一括変換する関数
"""
# pillow-heifをPillowライブラリに登録
pillow_heif.register_heif_opener()
# 出力ディレクトリがなければ作成
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
source_path = Path(source_dir)
if not source_path.is_dir():
print(f"エラー: '{source_dir}' は有効なディレクトリではありません。")
return
print(f"変換を開始します: {source_dir} -> {output_dir}")
# HEIC/HEIFファイルを大文字・小文字を区別せずに検索して変換
heic_files = list(source_path.glob('*.heic')) + list(source_path.glob('*.HEIC')) + \
list(source_path.glob('*.heif')) + list(source_path.glob('*.HEIF'))
if not heic_files:
print("変換対象のHEIC/HEIFファイルが見つかりませんでした。")
return
for heic_file in heic_files:
try:
# 画像を開く
image = Image.open(heic_file)
# JPEGのファイル名を生成 (例: IMG_001.HEIC -> IMG_001.jpeg)
jpeg_filename = heic_file.stem + ".jpeg"
jpeg_filepath = output_path / jpeg_filename
# RGBモードに変換してから保存 (透過情報などによるエラーを防ぐ)
image.convert("RGB").save(jpeg_filepath, "JPEG", quality=95)
print(f"変換完了: {heic_file.name} -> {jpeg_filepath.name}")
except Exception as e:
print(f"エラー: {heic_file.name} の変換に失敗しました - {e}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("使い方: rye run python convert.py <入力元ディレクトリ> <出力先ディレクトリ>")
sys.exit(1)
input_directory = sys.argv[1]
output_directory = sys.argv[2]
convert_heic_to_jpeg(input_directory, output_directory)
ステップ3:コードのポイント解説
pillow_heif.register_heif_opener()
これが魔法の一行です。例えるなら、画像処理の達人である`Pillow`に、「HEICという新しい言語の翻訳機を渡す」ようなものです。これを実行するだけで、Pillow`
は.heic
ファイルをJPEGやPNGと同じように扱えるようになります。Path(source_dir)
と.glob('*.heic')
標準ライブラリの`pathlib`を使っています。パスの操作をオブジェクトとして扱えるため、コードが直感的で分かりやすくなります。.glob()`
メソッドは、ワイルドカード(`*`)を使って、特定のパターンに一致するファイルを簡単に見つけ出してくれます。image.convert("RGB")
これは重要な処理です。HEIC画像には、JPEGにはない「透明度(アルファチャンネル)」の情報が含まれていることがあります。JPEG形式は透明度をサポートしていないため、保存する前に.convert("RGB")`
を使って透明度情報を除去し、純粋な色情報だけの画像に変換することで、エラーを防いでいます。sys.argv
以前のコマンドランチャーの回でも登場しましたね。このスクリプトに、ターミナルから「どのフォルダを(argv[1]
)」「どのフォルダへ(argv[2]
)」という指示を与えるために使っています。これにより、コードを書き換えずに、色々なフォルダを対象にできる再利用性の高いツールになっています。
ステップ4:ツールの使い方
- 上記のコードを `convert.py` として保存します。
- プロジェクトフォルダ内に、変換したいHEIC画像を入れたフォルダ(例: `heic_images`)を作成します。
- ターミナルで、以下のコマンドを実行します。
rye run python convert.py heic_images jpeg_images
すると、ターミナルに変換の進捗が表示され、プロジェクトフォルダ内に新しく`jpeg_images`というフォルダが作成され、その中に変換されたJPEG画像が保存されているはずです!
まとめ
今回は、`Pillow`とその拡張ライブラリを使い、iPhoneユーザーにとって悩みの種であるHEIC画像を、汎用的なJPEG画像に一括変換する、非常に実用的なツールを開発しました。
このプロジェクトを通して、Pythonで画像処理を行う基本だけでなく、`pathlib`によるモダンなファイル操作や、`sys.argv`を使った再利用性の高いツール設計についても学ぶことができました。
ぜひ、このツールをあなたの写真整理に役立ててみてください!
コメント