概要
heif-convert(libheif) を使って HEIC(HEIF) から JPG へ変換する方法です。
Ubuntu 22.04 で実行
使用方法
下記でインストールすれば使用できます。
$ sudo apt install libheif-examples
$ sudo apt list | grep libheif libheif-dev/jammy 1.12.0-2build1 amd64 libheif-examples/jammy,now 1.12.0-2build1 amd64 libheif1/jammy,now 1.12.0-2build1 amd64
バージョン 1.12.0 では、下記の通り、オプションが少ないです。
USAGE: heif-convert [-q quality 0..100] <filename> <output>
iPhoneの画像を変換すると、IMG_XXXX-urn:com:apple:photo:2020:aux:hdrgainmap.JPG のように、Auxiliary image としてHDRのゲインマップ画像が一緒に生成される場合があります。
conv_heic_to_jpeg.sh
libimage-exiftool-perl をインストールします。 exif-tool を使用して変換後のJPGファイルに angle 情報を再書き込みするようにするスクリプトです。
#!/usr/bin/bash heif-convert $1 $2 exiftool -overwrite_original -Orientation=$(heif-info $1 | grep 'angle (ccw):' | awk '{print $3}') -n $2
下記のように実行します。
$ conv_heic_to_jpeg.sh INPUT.HEC OUTPUT.JPG
一括変換する例
- カレントディレクトリに iPhone13mini ディレクトリがあり、その中に YYYYMM__ ディレクトリがあり、HEICファイルが格納されている
- カレントディレクトリの temp/ 以下の同じ階層でディレクトリを作成し、その中に変換後のJPGファイルを格納する
find iPhone13mini -type d -exec bash -c 'echo ./temp/"{}"' \; | xargs mkdir -p find iPhone13mini -iname "*.HEIC" | sed s/.HEIC// | xargs -t -n1 bash -c './conv_heic_to_jpeg.sh $0.HEIC ./temp/$0.JPG'
Docker Image を作成
概要
ここでは、node:21 をベースイメージとして、libheif v1.17.6 をビルドしています。 また、exif-tool を使用して変換後のJPGファイルに angle 情報を再書き込みするようにしています。
ファイル
Dockerfile
FROM node:21 RUN apt update RUN apt install -y cmake RUN apt install -y libexpat1-dev RUN apt install -y libglib2.0-dev RUN apt install -y liblcms2-dev RUN apt install -y libgsf-1-dev RUN apt install -y liborc-0.4-dev RUN apt install -y libde265-dev RUN apt install -y libexif-dev # install libheif RUN apt purge -y libheif1 libheif-dev WORKDIR /home/node RUN git clone https://github.com/strukturag/libheif.git -b v1.17.6 WORKDIR /home/node/libheif RUN mkdir build WORKDIR /home/node/libheif/build RUN cmake --preset=release .. RUN make RUN make install RUN ldconfig RUN apt install -y libimage-exiftool-perl RUN mkdir /home/node/bin WORKDIR /home/node/bin COPY entrypoint.sh /home/node/bin/entrypoint.sh RUN chmod +x /home/node/bin/entrypoint.sh ENTRYPOINT ["/home/node/bin/entrypoint.sh"] CMD ["input-file","output-file"]
entrypoints.sh
#!/usr/bin/bash heif-convert $1 -o $2 exiftool -overwrite_original -Orientation=$(heif-info $1 | grep 'angle (ccw):' | awk '{print $3}') -n $2
ビルド方法
$ docker build . -t convert-heic-to-jpeg3
使用方法
docker run で直接変換する
$ docker run --rm -v `pwd`:/home/node/work -w /home/node/work convert-heic-to-jpeg3 INPUT.HEIC OUTPUT.JPG
docker run で bash を起動する
$ docker run --entrypoint '' --rm -it -v $(pwd):/home/node/work -w /home/node/work convert-heic-to-jpeg3 bash
一括変換する例
- カレントディレクトリに iPhone13mini ディレクトリがあり、その中に YYYYMM__ ディレクトリがあり、HEICファイルが格納されている
- カレントディレクトリの temp/ 以下の同じ階層でディレクトリを作成し、その中に変換後のJPGファイルを格納する
find iPhone13mini -type d -exec bash -c 'echo ./temp/"{}"' \; | xargs mkdir -p find iPhone13mini -iname "*.HEIC" | sed s/.HEIC// | xargs -t -n1 bash -c 'docker run --rm -v `pwd`:/home/node/work -w /home/node/work convert-heic-to-jpeg3 $0.HEIC ./temp/$0.JPG'