【PythonでHEICを変換するプログラムを作ろう!】

スポンサーリンク

はじめに

最近のiPhoneでよく使われるHEIC形式の画像を他の形式に変換する方法を、Pythonを使って解説します。プログラミング初心者でも理解しやすいように、手順を詳しく解説していきます。

HEIC形式の画像には、いくつかの特徴と問題点があります。HEIC形式はJPEGよりも高圧縮されているため、同じ画質の画像であってもファイルサイズが小さくなります。また、透過やアルファチャンネルの情報も持つことができます。しかし、一部のデバイスやアプリでは直接扱えないことがあります。そこで、Pythonを使ってHEIC形式の画像を他の形式に変換するプログラムを作ることで、問題を解決することができます。

今回の構成

今回の構成としては以下の通りです。

main
|-static
|  |-style.css
|-templates
|  |-upload.html
|-main.py

全体コード

また、今回のpythonコードは以下の通りです。今回のコードは以下のGithubに載せています。

GitHub - Natsu16Meku/HIEC-Converter
Contribute to Natsu16Meku/HIEC-Converter development by creating an account on GitHub.
from flask import Flask, request, send_file, render_template
from PIL import Image
import pillow_heif
import io
import os

app = Flask(__name__)

@app.route('/')
def upload_file():
    return render_template("upload.html")

@app.route('/convert', methods=['POST'])
def convert_image():
    if 'file' not in request.files:
        return 'ファイルがありません'
    
    file = request.files['file']
    output_format = request.form.get('format', 'JPEG')
    filename, file_extension = os.path.splitext(file.filename)
    custom_filename = request.form.get('custom_filename', 'converted_image') or filename
    if file.filename == '':
        return 'ファイルが選択されていません'
    
    if file:
        if file_extension.lower() in ['.heic', '.heif']:
            # HEIC/HEIFファイルを指定された形式に変換
            heif_file = pillow_heif.read_heif(file.stream)
            image = Image.frombytes(
                "RGB", 
                heif_file.size, 
                heif_file.data,
                "raw",
                "RGB",
                heif_file.stride,
            )
        else:
            # 他の形式のファイルを選択された形式に変換
            image = Image.open(file.stream)

        output = io.BytesIO()
        image.save(output, format=output_format)
        output.seek(0)
        download_filename = f'{custom_filename}.{output_format.lower()}'
        return send_file(
            output,
            as_attachment=True,
            download_name=download_filename
        )

if __name__ == '__main__':
    app.run(debug=True)

作業開始

まずは、プログラムを作るために必要なライブラリのインストールと設定から始めましょう。必要なライブラリはPillowというPythonの画像処理ライブラリです。また、今回は操作しやすいようにflaskというライブラリを使ってlocalhostでウェブアプリケーションを作成します。

依存関係のインストール

  • Flask: Webアプリケーションを作成するためのフレームワーク。
  • Pillow: 画像処理を行うためのライブラリ。
  • pillow_heif: HEIF/HEIC形式の画像を扱うための拡張パッケージ。

これらは、以下のコマンドを使ってインストールできます。

pip install pillow pillow-heif flask

Flaskアプリケーションのセットアップ

このコードはFlaskアプリケーションを作成しています。Flask(__name__)によりアプリケーションのインスタンスが作成され、それを使ってWebサービスが提供されます。

from flask import Flask, request, send_file, render_template
from PIL import Image
import pillow_heif
import io
import os

app = Flask(__name__)

ルートとエンドポイント

各エンドポイントの処理を設定するコードです。

ルートURLへのアクセス:

@app.route('/')
def upload_file():
    return render_template("upload.html")

画像変換エンドポイント:

@app.route('/convert', methods=['POST'])
def convert_image():
    if 'file' not in request.files:
        return 'ファイルがありません'

    file = request.files['file']
    output_format = request.form.get('format', 'JPEG')
    filename, file_extension = os.path.splitext(file.filename)
    custom_filename = request.form.get('custom_filename', 'converted_image') or filename

    if file.filename == '':
        return 'ファイルが選択されていません'

    if file:
        if file_extension.lower() in ['.heic', '.heif']:
            heif_file = pillow_heif.read_heif(file.stream)
            image = Image.frombytes(
                "RGB", 
                heif_file.size, 
                heif_file.data,
                "raw",
                "RGB",
                heif_file.stride,
            )
        else:
            image = Image.open(file.stream)

        output = io.BytesIO()
        image.save(output, format=output_format)
        output.seek(0)
        download_filename = f'{custom_filename}.{output_format.lower()}'
        return send_file(
            output,
            as_attachment=True,
            download_name=download_filename
        )

最後に、アプリケーションを実行するコードを追加します。デバッグモードを有効にしておくと開発中のエラーがわかりやすくなります。

if __name__ == '__main__':
    app.run(debug=True)

フロントエンドの作成

html:

<!doctype html>
<html>
<head>
    <title>Image Converter</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <h1>画像ファイルを変換</h1>
    <form action="/convert" method="post" enctype="multipart/form-data">
        <input type="file" name="file"><br><br>
        <label for="format">出力形式を選択:</label>
        <select name="format">
            <option value="JPEG">JPEG</option>
            <option value="PNG">PNG</option>
            <option value="BMP">BMP</option>
            <option value="GIF">GIF</option>
            <option value="TIFF">TIFF</option>
            <option value="WebP">WebP</option>
        </select><br><br>
        <label for="custom_filename">カスタムファイル名:</label>
        <input type="text" name="custom_filename" placeholder="converted_image"><br><br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>

css:

body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 20px;
}

h1 {
    color: #333;
}

form {
    background: #fff;
    padding: 20px;
    border-radius: 8px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

アプリケーションの実行

作ったアプリケーションを実行してみましょう。コンソールに以下のコマンドを入力してください。

python main.py

これで http://127.0.0.1:5000にアクセスすると実行したアプリケーションを使用できます。

さいごに

もしエラーが発生したり、うまく変換できない場合は、以下のヒントや注意事項を参考にしてください。

  • Pillowライブラリのバージョンが古い場合は、最新版にアップデートしてみてください。
  • インストールしたライブラリのパスが正しく設定されているか確認してください。
  • 変換元のHEIC形式の画像ファイルが存在することを確認してください。

今回紹介したPythonのプログラムを使えば、HEIC形式の画像を簡単に他の形式に変換することができます。プログラミング初心者でも理解しやすいように、手順を詳しく解説しましたが、エラー解決のヒントや注意事項にも注意しながら実装してください。さらに、応用編では他の機能の追加やパフォーマンスの最適化の方法も紹介していますので、実践的な知識を身につけることができます。

ぜひこの記事を読んで、PythonでHEIC形式の画像を変換する方法を試してみてください。きっとあなたの写真や画像の編集作業がより便利で楽しくなるはずです!

コメント

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