見出し画像

Python_HEICファイルで保存された画像をJEPGに変換する #431

3か月くらい前から自宅にSynologyのNASを構築して、家族の写真や動画をそこに保存するようにしました。それに伴って、これまでいくかのサービスに分散していた過去の写真も集約していたのですが、ある課題にぶつかりました。

Amazon Photosから一度PCに写真を落としてNASにアップロードしたところ、サムネイルに「HEIC」という文字列だけが出て、何の写真か一見して分からなくなったのです(クリックすれば画像は見れますが)。

HEICはIPhoneで撮影した写真の保存形式で、Synologyのアプリとは互換性が悪いみたいです。

そこで、ダウンロードしたHEICファイルをJPEGファイルに変換するプログラムを試してみました。

プログラム自体はほとんどこちらのブログに記載されている通りです。


HEICとは

HEICファイルは「High-Efficiency Image Container」の略で、2015年に完成し、AppleがiOS11から採用したオリジナルの拡張子です。一般的な画像の拡張子である「JPEG」よりも高画質のデータをより軽い容量で圧縮できます。

特徴を箇条書きすると以下らしいです。

・圧縮効率が良い (JPEG比で140%程度の高効率)
・16bitカラーに対応 (iPhoneカメラは10bitでキャプチャ)
・ダイナミックレンジが拡張される

HEIC、JPEGの違いをよく知らなかったので調べてみた

便利である一方、今回起きているように互換性にやや弱みがあります。

HEICをJPEGに変換する

プログラムは以下です。

import glob
import pathlib
import pillow_heif
from PIL import Image
 
 
def heic_jpg(image_path, save_path):
    heif_file = pillow_heif.read_heif(image_path)[0]  # 常に1つファイルだけが返ってくるので、[0]をつける
    image = Image.frombytes(
        heif_file.mode,
        heif_file.size,
        heif_file.data,
        'raw',
        heif_file.mode,
        heif_file.stride,
    )
    image.save(save_path, "JPEG")


hiec_dir = "C:/Users/user_name/Downloads/AmazonPhotos"
save_dir = "C:/Users/user_name/Downloads/AmazonPhotos_jpg"

hiec_dir = pathlib.Path(hiec_dir)
save_dir = pathlib.Path(save_dir)

heic_path = list(hiec_dir.glob('**/*.HEIC'))

for i in heic_path:
    image_path = str(i)
    save_path =  str(save_dir / i.stem) + '.jpg'
    heic_jpg(image_path, save_path)

掻い摘んで内容を解説します。

heif_file = pillow_heif.read_heif(image_path)[0]

↑パスからHEICファイル(画像データ)を取得します。リスト形式でreturnされますが、要素は1つしかないので[0]で最初のものだけを取ります。

    image = Image.frombytes(
        heif_file.mode,
        heif_file.size,
        heif_file.data,
        'raw',
        heif_file.mode,
        heif_file.stride,
    )

↑画像を操作するために「PIL (pillow)」ライブラリのImageモジュールを使います。Image.frombytes()はバイトデータからPillowのImageオブジェクトを作成でき、元のバイトデータをHEICファイルから取得します。

hiec_dir = pathlib.Path(hiec_dir)
save_dir = pathlib.Path(save_dir)

↑ディレクトリのパスをPathオブジェクトに変換しています。Pathオブジェクトを使用すると、パスに関連する操作を簡単に行うことができます。

save_path =  str(save_dir / i.stem) + '.jpg'

↑この行では保存先のJPEGファイルのパスを作成しています。i.stemは、ファイル名(拡張子を除く)を表します。つまり元のHEICファイルと同じ名前のJPEGファイルを保存するパスを作成します。

結果

無事にJPEGに変換され、Synologyのアプリでもサムネイルが見れるようになりました。

ただ、画像の日付=プログラムの実行日になってしまいました。

画像の日付を編集するプログラムも作ろうとしましたが、これはこれで奥深そうなので次回に持越しです。

ここまでお読みいただきありがとうございました!

参考


この記事が気に入ったらサポートをしてみませんか?