少々強引な方法ですが、ImageMagick で HEIF 画像を読む方法です。
iPhone7 以降の機種で iOS11 が入っていると HEIC 拡張子のファイルが出来る事があります。
これが HEIF 画像で、JPEG の地位を奪おうという野心溢れる次世代の画像フォーマットです。
はじめに注意
2018年1月下旬リリースの ImageMagick-6.9.9-34,-7.0.7-22 で HEIF 読み込みに対応しているので、そのバージョンまで上げると、この記事で紹介する設定(1行追加)は邪魔になります。その時は忘れずに設定を消して下さい。自信がない時はこの記事を見なかった事にして頂けるとありがたく。。
ImageMagick に入った HEIF 対応コード(coders/heic.c)は iPhone が出力した HEIC ファイル以外は全く読めない状態です(item_id が 1 から順に採番される仮定を置いてるのが厳しいのと、多分タイル仕様決めうちでデコードしてそう)。今のところこの記事の方法が良い気がします。
2019年4月追記
2018年6月頃に HEIF 読み書き独自実装をやめて libheif を利用するようになったので、この記事の存在価値はなくなったかもしれません。2019年4月時点でも絶賛改善中なので、なるべく新しいバージョン推奨。せめて brand 解釈が直った 2018年10月以降のバージョンを使った方が良さそうです。
Delegate
ImageMagick は自身が対応してない画像フォーマットでも Delegate と呼ぶ仕組みで外部コマンドを呼び出して画像の読み書きが出来ます。
libde265 で有名な struktur AG さんが公開している libheif レポジトリに含まれる heif-convert コマンドを使うと HEIF 画像を JPEG や PNG に変換出来るので、これを利用します。
libde265 と libheif のビルドはこちらを参考にして下さい。
- libheif の heif-convert コマンド
% which heif-convert
/usr/local/bin/heif-convert
% heif-convert IMG_0001.HEIC output.JPG
File contains 1 images
% heif-convert IMG_0001.HEIC output.PNG
File contains 1 images
%
さて、設定ファイルでこれに繋げてみます。
ImageMagick の設定ファイル
設定ファイルの置き場所は -list configure で分かります。
% convert -list configure | grep CONFIGURE_PATH
CONFIGURE_PATH /usr/local/etc/ImageMagick-7/
%
この中の delegate.xml を編集します。元の delegate.xml ファイルはバックアップして残した方が良いでしょう。
delegate.xml
入力画像に *.heic ファイルを指定されたら heif-convert で PNG に変換する。というルールを追加します。
<delegatemap>
<delegate decode="heic" command=""heif-convert" "%i" "%o.png" ; /bin/mv "%o.png" "%o""/>
delegatemap の先頭に1行追加するだけです。
このエントリの command のエスケープを解くとこうなります。
'heif-convert' '%i' '%o.png' ; /bin/mv '%o.png' '%o';
Delegate のルール記述は %i に入力画像、%o に(ImageMagickに渡す)出力画像を指定すれば良いのですが、これらは一時ファイルとしてランダムなファイル名となり拡張子が付きません。heif-convert は拡張子を見て出力を PNG か JPEG で切り替えるので、一旦 .png を付けたファイルで変換して、改めて %o にファイル名を変えます。
結果
% convert IMG_0085.HEIC IMG.jpg
File contains 1 images
Written to /var/folders/t9/4(略)n/T/magick-6(略)F.png
% identify IMG.jpg
IMG.jpg JPEG 4032x3024 4032x3024+0+0 8-bit sRGB 1836300B 0.000u 0:00.000
% identify IMG_0085.HEIC
File contains 1 images
Written to /var/folders/t9/4(略)n/T/magick-6(略)P.png
IMG_0085.HEIC PNG 4032x3024 4032x3024+0+0 8-bit sRGB 9800610B 0.000u 0:00.000
% compare IMG_0085.HEIC t.jpg -metric SSIM null:
File contains 1 images
Written to /var/folders/t9/4(略)n/T/magick-6(略)s.png
0.987059%
%
identify が PNG と表示するのは、HEIF のままだと読めないので Delegate を介して PNG にして読んでるからです。
あと、convert で変換するだけなら直接 heif-convert を呼べば良いのですが、compare 等他のコマンドでも HEIF を直接指定出来るのは、大変便利です。