ImageMagickがHEICの読み込みに対応

 iPhone8/iPhoneXから採用されたHEVC(H.265)を利用したHEIF/HEICですが、ImageMagickがHEICコンテナの画像読み込みに対応していました。
 

ImageMagickのHEIC対応の確認

 最新のImageMagickを導入したら気付いたのですが、拡張子.heicの読み込みに対応していました。
 ImageMagickはconvert -list formatで対応フォーマットの一覧が表示できますが、heicに関して確認してみると以下の通り。

REM 最新のImageMagick Version 7.0.7ではHEICの読み込みに対応
C:\>"c:\Program Files\ImageMagick-7.0.7-Q16-HDRI\convert.exe" -list format | findstr -i hei
     HEIC* HEIC      r--   Apple High efficiency Image Format

REM 【参考】旧Versionでは非対応(Version 7.0.1の例)
C:\>"c:\Program Files\ImageMagick-7.0.1-Q16\convert.exe" -list format | findstr -i hei

 

HEIC対応し始めたImageMagickのバージョン

 詳細にいつから対応していたのかChangeLogを確認してみると、7.0.7-22から(Windows版は7.0.7-23から)HEICの読み込みをサポートしたようです。

2018-02-09 7.0.7-23 Dirk Lemstra <dirk@lem.....org>
- Add support for reading the HEIC image format to the Windows build.

2018-01-06 7.0.7-22 Cristy <quetzlzacatenango@image...>
- Add support for reading the HEIC image format (reference https://github.com/ImageMagick/ImageMagick/issues/507).

Changelog @ ImageMagick
 

HEICにどう対応したのか

 HEICに使われるエンコード方式*1であるHEVC(H.265)はロイヤリティーフリーな技術ではなく、特許使用料が必要なはずです。

 そこで、ImageMagickではどのようにH.265を扱っているのかソースコードを軽く調べてみました。

 H.265の入出力を司るソースコードはcoders/heic.cになるようです。
 ※入出力と書きましたが現時点で実装されているのは入力のみです。コメントヘッダには、"Read/Write Heic Image Format"と記述されていますので、将来的には出力にも対応するのかもしれません。
ImageMagick/heic.c at master · ImageMagick/ImageMagick · GitHub

 コード中のReadHEICImage(const ImageInfo *image_info, ExceptionInfo *exception)がHEICの読み込み関数のようで、その肝心のH.265デコードの部分にはde265_new_decoder()が用いられており、これはインクルードされているlibde265/de265.hに定義されているようです。
 ffmpegなどでlibx264やlibx265はよく見かけますが、libde265というライブラリは初めて見ました。調べてみると、GNU Lesser General Public LicenseすなわちLGPLライセンスのOSSライブラリのようです。なお、HEVCの特許については何も言及されていないようです。
GitHub - strukturag/libde265: Open h.265 video codec implementation.
 蛇足ながらlibx265の方はGNU GPL 2 licenseなので、GPLv2ライセンスとなっています。こちらもHEVCの特許については何も言及されていないようです。
x265 HEVC Encoder / H.265 Video Codec

 故に、ImageMagickのHEICサポートのためのH.265周りは、デコーダソフトウェアに関してはLGPLのlibde265を使っていることが判り、著作権周りの疑問はクリアになりましたが、特許権の観点からH.265を使用すること自体の適法性に関しては不明確です。
 ですのでImageMagickでHEICを読めるようになったからと言って、これを利用してHEICを入力として扱えるサービスを作って公表したりすると、パテントホルダから特許使用料の支払いを求められる可能性が有ると認識すべきでしょうし、それを拒めば訴訟リスクもあるでしょう。
 そのパテントホルダとライセンス契約を交わそうにも、H.264のようにMPEG-LAとだけ契約すればよいというわけでもなく、どこと契約すれば抜け漏れなく合法的にH.265が利用できるのかも相変わらずよく判らないので、個人的にはHEVC(H.265)でエンコードされたHEICを扱うメリットは感じません。
 
 法的な話はこの位にして、引き続きReadHEICImage()のコードを軽く見た限りでは、heicの中身はH.265でエンコードされていると決め打ちしているようなコードに見えますし、マジックナンバーリテラルで記述されていたりと、どうやらiPhoneの出力するheicファイルだけをターゲットにした読み込み処理ではないかと察せられます。heicコンテナの柔軟性(というか多様性)は無視しているようなので、iPhone以外で生成されたheicファイルは読み込めないのではないかと想像されます。
 



以上。

*1:HEICコンテナの使用としてはH.265に限らず例えばJPEGを格納したりもできるものの、HEICが現在使われているのは主にiPhoneによる画像記録だけ。そして、iPhoneのHEICファイルには必ずH.265が使われる。