ImageMagick-6.9.9-34差分

ImageMagick-6.9.9-33差分 - yoyaのメモの続き

The latest release of ImageMagick is version 6.9.9-34

※ HEIC(HEIF) 対応は ImageMagick-6.9.9-44 で libheif を使う形で一から作り直されてます。

まとめ

  • HEIC 画像フォーマット読み込み対応 (HEIF コンテナに H.265/HEVC を入れた時の拡張子が HEIC)
    • 但し、iPhone の出力する HEIF 画像のみ。
    • nokiatech や GPAC の conformance test 画像は読めない
    • iPhone の出力する HEIF コンテナは複雑な方なので、今後、規格カバー率が上がっていくと思われます
  • -crop 3:2 のようなアクペクト比指定をサポート。
  • 沢山のメモリリーク修正
  • ChangeLog にないけど
    • いくつかのマイナーな画像フォーマットで読み出し中に画像回転すると、メモリリークしてた。
HEIC 対応ビルド

HEIC 内の H.265/HEVC Intra frame デコードで libde265 を利用します。

  • libde265 ビルド
$ git clone  https://github.com/strukturag/libde265 
$ cd libde265 
$ ./configure --disable-sherlock265  # sherlock265 は Qt ライブラリを必要とする為
$ make install
$ ./configure --prefix=<インストール先> --with-heic=yes
% make install
  • コンバート実行 (iPhone X の標準カメラで生成した HEIC ファイル)
% ~/ImageMagick/6.9.9-34/bin/convert IMG_0085.HEIC output.jpg
% identify output.jpg
output.jpg JPEG 4032x3024 4032x3024+0+0 8-bit sRGB 1.65668MiB 0.000u 0:00.000

この画像は HEIF のタイリング機能を使ってて、つまり READ 時にちゃんとグリッド展開してるって事。やりおる。。

しかし、iPhone から吸い出した HEIC コンテナ構造決め打ちで作ってるみたいで、それ以外は駄目。

% cd git/nokiatech/heif_conformance/conformance_files
% ~/ImageMagick/6.9.9-34/bin/convert C001.heic t.png
convert: Bad image: "only base_offset_size=0 and index_size=0 are supported" `ParseIlocAtom': No such file or directory @ error/heic.c/ParseIlocAtom/565.
convert: Bad image: "atom parsing failed" `ParseAtom': No such file or directory @ error/heic.c/ParseAtom/693.
convert: Bad image: "item id is incorrect" `ParseInfeAtom': No such file or directory @ error/heic.c/ParseInfeAtom/488.
convert: Bad image: "atom parsing failed" `ParseAtom': No such file or directory @ error/heic.c/ParseAtom/693.
convert: Bad image: "item id is incorrect" `ParseIpmaAtom': No such file or directory @ error/heic.c/ParseIpmaAtom/526.
convert: Bad image: "atom parsing failed" `ParseAtom': No such file or directory @ error/heic.c/ParseAtom/693.
convert: Unable to decode image grid `ReadHEIC': No such file or directory @ error/heic.c/ReadHEICImage/1146.
convert: no images defined `t.png' @ error/convert.c/ConvertImageCommand/3258.
% 

GPAC の comformance test も駄目です。base_offset_size=4 とかなので。

<上記のと似たようなエラーなので略>

あと些細(?)な事ですが、identify 対応をど忘れしてる模様。

% ~/ImageMagick/6.9.9-34/bin/identify IMG_0085.HEIC
%
Aspect ratio crop geometry


% ~/ImageMagick/6.9.9-34/bin/convert CmXJAiKVIAARbpd.png -crop 3:1 out.png


気になる事
  • HEIC の description が Apple High efficiency Image Format だけど、いいのかな。開発元は Nokia Technologies で規格化は MPEG と ISO で、Apple は iOS11 と macOS High Sierra に搭載しただけじゃないっけ?

差分

> % Anton Kortunov %
> % Copyright 2017-2018 YANDEX LLC.

coders/cin.c
449a450
>   ResetMagickMemory(&cin,0,sizeof(cin));
  • coders/dcm.c
3566a3567,3568
>             if (graymap != (int *) NULL)
>               graymap=(int *) RelinquishMagickMemory(graymap);
3872a3875,3878
>       if (stream_info->offsets != (ssize_t *) NULL)
>         stream_info->offsets=(ssize_t *)
>           RelinquishMagickMemory(stream_info->offsets);
4009a4027,4032
>           {
>             if (stream_info->offsets != (ssize_t *) NULL)
>               stream_info->offsets=(ssize_t *)
>                 RelinquishMagickMemory(stream_info->offsets);
>             if (info.scale != (Quantum *) NULL)
>               info.scale=(Quantum *) RelinquishMagickMemory(info.scale);
  • coders/mat.c, (他沢山)
564c564
<     *Size -= magick_size;
---
>     *Size -= (unsigned int) magick_size;
784,789d783
<     rotate_image=RotateImage(image,90.0,exception);
<     if (rotate_image != (Image *) NULL)
<       {
<         image=DestroyImage(image);
<         image=rotate_image;
<       }
  • coders/fits.c
396a397,399
>       {
>         if (comment != (char *) NULL)
>           comment=DestroyString(comment);
ChangeLogにない差分
  • /PerlMagick/quantum/quantum.xs
    • struct Methods の Arguments の初期化。(global な static 変数なので NULL が入るはずだけど、明示的に)
static struct
  Methods
  {
    const char
      *name;

    Arguments
      arguments[MaxArguments];
  } Methods[] =
144a145
>   NullReference = 0,
226c227
<     { "Despeckle", },
---
>     { "Despeckle", { { (const char *) NULL, NullReference } } },
  • README.txt
    • JPEG-2000 を消して HEIC に。あれ?消すの?
5c5
<   200) including PNG, JPEG, JPEG-2000, GIF, TIFF, DPX, EXR, WebP, Postscript,
---
>   200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript,
  • coders/bmp.c
    • 異常系チェック沢山
1064a1065
>           {
1065a1067,1069
>             if (shift.red > 32U)
>               break;
>           }
<以下同様>
       /*
         Initialize BMP raster file header.
       */
1648a1681
>     if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
            (void) TransformImageColorspace(image,sRGBColorspace);
  • coders/dcm.c
3310c3310
<     if ((unsigned int) ((group << 16) | element) == 0xFFFEE0DD)
---
>     if ((((unsigned int) group << 16) | element) == 0xFFFEE0DD)
3908c3914,3921
<         (void) ReadBlobByte(image);
---
>       {
>         int
>           c;
>
>         c=ReadBlobByte(image);
>         if (c == EOF)
>           break;
>       }
3922a3936
>           {
3923a3938,3940
>             if (EOFBlob(image) != MagickFalse)
>               break;
>           }
  • coders/dpx.c
816c816,817
<   if (dpx.image.number_elements > MaxNumberImageElements)
---
>   if ((dpx.image.number_elements < 1) ||
>       (dpx.image.number_elements > MaxNumberImageElements))
1172c1173
<     if (image->depth > 32)
---
>     if ((image->depth == 0) || (image->depth > 32))
  • coders/gif.c
228a229,232
>   (void) ResetMagickMemory(lzw_info->table[0],0,MaximumLZWCode*
>     sizeof(**lzw_info->table));
>   (void) ResetMagickMemory(lzw_info->table[1],0,MaximumLZWCode*
>     sizeof(**lzw_info->table));

ChangeLog

2018-01-22  6.9.9-34 Cristy  <quetzlzacatenango@image...>
  * Release ImageMagick version 6.9.9-34, GIT revision 12574:5370ede60:20180122.

2018-01-06  6.9.9-34 Cristy  <quetzlzacatenango@image...>
  * Support aspect ratio geometry, e.g. -crop 3:2.
  * Add support for reading the HEIC image format (reference
    https://github.com/ImageMagick/ImageMagick/issues/507).
  * Fix IM build when HEIC is enabled.
  * Fixed numerous memory leaks, credit to OSS Fuzz.