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'
Copied title and URL