PR

【HEIC形式にも対応】画像変換プログラムの紹介

1. インストール手順

このプログラムを実行するためには、Pythonの環境といくつかのライブラリが必要です。以下の手順に従ってインストールを行ってください。

  1. Pythonのインストール
    Pythonがインストールされていない場合は、公式サイトからダウンロードしてインストールしてください。
    Python公式サイト
  2. 必要なライブラリのインストール
    ターミナルを開き、以下のコマンドを実行してライブラリをインストールします。
   pip install Pillow pillow-heif

2. プログラムの説明

次に、各プログラムごとの説明を行います。

ライブラリのインポート

import os
from PIL import Image, UnidentifiedImageError
from pillow_heif import register_heif_opener
  • os: ファイル操作を行うための標準ライブラリ。
  • PIL.Image: 画像操作を行うためのライブラリPillowのモジュール。
  • Pillow.heif.register_heif_opener: HEIF形式の画像を扱うためのモジュール。

HEICオープナーを登録

register_heif_opener()
  • HEIC形式の画像を開くための設定を行います。

メインの変換関数

def convert_images(folder_path, target_format='PNG'):
    # フォルダ内のすべてのファイルを取得
    files = os.listdir(folder_path)

    for file in files:
        # ファイルの拡張子を取得
        file_name, file_extension = os.path.splitext(file)
        file_extension = file_extension.lower()

        # 画像ファイルのみを処理
        if file_extension in ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.heic', '.heif']:
            # 画像を開く
            img_path = os.path.join(folder_path, file)
            try:
                with Image.open(img_path) as img:
                    # 新しいファイル名を作成(拡張子のみ変更)
                    new_filename = file_name + '.' + target_format.lower()
                    new_path = os.path.join(folder_path, new_filename)

                    # RGB形式に変換(PNGの場合は透過性を保持)
                    if img.mode in ('RGBA', 'LA') and target_format.upper() == 'PNG':
                        # PNGの場合、透過性を保持
                        img.save(new_path, target_format.upper())
                    else:
                        # JPEGの場合、RGBに変換
                        img = img.convert('RGB')
                        img.save(new_path, target_format.upper())

                    # 元のファイルを削除(同じファイルでない場合のみ)
                    if img_path.lower() != new_path.lower():
                        os.remove(img_path)

                    print(f'Converted and replaced: {file} -> {new_filename}')
            except UnidentifiedImageError:
                print(f"Error: Cannot identify image file '{file}'. Skipping this file.")
            except Exception as e:
                print(f"Error processing '{file}': {str(e)}")
  • convert_images: 画像を指定のフォーマットに変換するメイン関数。
  • os.listdir: 指定したフォルダ内のファイル一覧を取得。
  • os.path.splitext: ファイル名と拡張子を分離。
  • Image.open: 画像ファイルを開く。
  • img.convert: 画像をRGB形式に変換。
  • img.save: 画像を保存。
  • os.remove: 元のファイルを削除。

メイン処理

if __name__ == "__main__":
    folder_path = input("変換したい画像があるフォルダのパスを入力してください: ")
    target_format = input("変換後のフォーマットを入力してください (PNG または JPG): ").upper()

    if target_format not in ['PNG', 'JPG']:
        print("無効なフォーマットです。PNG または JPG を指定してください。")
    else:
        convert_images(folder_path, target_format)
  • input: ユーザーからフォルダパスと変換フォーマットを入力。
  • if name == “main”: スクリプトが直接実行された場合のみメイン処理を実行。

3. 全体のプログラム

以下に、全体のプログラムを示します。

import os
from PIL import Image, UnidentifiedImageError
from pillow_heif import register_heif_opener

# HEICオープナーを登録
register_heif_opener()

def convert_images(folder_path, target_format='PNG'):
    # フォルダ内のすべてのファイルを取得
    files = os.listdir(folder_path)

    for file in files:
        # ファイルの拡張子を取得
        file_name, file_extension = os.path.splitext(file)
        file_extension = file_extension.lower()

        # 画像ファイルのみを処理
        if file_extension in ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.heic', '.heif']:
            # 画像を開く
            img_path = os.path.join(folder_path, file)
            try:
                with Image.open(img_path) as img:
                    # 新しいファイル名を作成(拡張子のみ変更)
                    new_filename = file_name + '.' + target_format.lower()
                    new_path = os.path.join(folder_path, new_filename)

                    # RGB形式に変換(PNGの場合は透過性を保持)
                    if img.mode in ('RGBA', 'LA') and target_format.upper() == 'PNG':
                        # PNGの場合、透過性を保持
                        img.save(new_path, target_format.upper())
                    else:
                        # JPEGの場合、RGBに変換
                        img = img.convert('RGB')
                        img.save(new_path, target_format.upper())

                    # 元のファイルを削除(同じファイルでない場合のみ)
                    if img_path.lower() != new_path.lower():
                        os.remove(img_path)

                    print(f'Converted and replaced: {file} -> {new_filename}')
            except UnidentifiedImageError:
                print(f"Error: Cannot identify image file '{file}'. Skipping this file.")
            except Exception as e:
                print(f"Error processing '{file}': {str(e)}")

if __name__ == "__main__":
    folder_path = input("変換したい画像があるフォルダのパスを入力してください: ")
    target_format = input("変換後のフォーマットを入力してください (PNG または JPG): ").upper()

    if target_format not in ['PNG', 'JPG']:
        print("無効なフォーマットです。PNG または JPG を指定してください。")
    else:
        convert_images(folder_path, target_format)

4. 活用事例

このプログラムは、例えば以下のような状況で活用できます。

  • HEIC形式の写真をJPEGやPNGに変換:iPhoneで撮影したHEIC形式の写真をWindowsやウェブで使いやすいJPEGやPNG形式に変換。
  • 大量の画像を一括変換:多くの画像ファイルを一度に変換し、ファイル管理を簡素化。
  • 画像のフォーマット統一:プロジェクトで使用する画像のフォーマットを統一する際に役立ちます。

このプログラムを利用することで、画像のフォーマット変換が効率的に行えます。

タイトルとURLをコピーしました