このエントリー
をはてなブックマークに追加
published on in ImageMagick
tags: ImageMagick JPEG Orientation

もうサムネイルで泣かないための ImageMagick ノウハウ集に一言

もうサムネイルで泣かないための ImageMagick ノウハウ集に一言

https://speakerdeck.com/yoya/imagemagick-knowhow

発表スライドだと URL のリンクが辿りにくいのとブログ形式で読みたいとの声があり、ほぼ同じ内容のエントリを作りました。

一部界隈で話題

色んなノウハウが詰まっていて素晴らしい記事です。便乗して幾つか勝手に補足してみます。

良いノウハウ

リリース大量消費に注意

  • limit 大事 (特にユーザ投稿画像を扱う場合)
    $ convert -limit memory 256MB -limit disk 0 src.jpg dst.png
    

画像や処理によって予期しない量のメモリを使われる事があるので、-limit memory で制限をかけるのと、仮にディスクが使われた日には極端に遅くなるので -limit disk も必要です。

CMYK 画像を考慮しよう

画像データの色の表現は主に RGB と CMYK が使われます。この内 CMYK の画像をそのままリサイズすると色味が壊れます。これはリサイズの補間アルゴリズムがリニアRGBを前提としているからだと思われます。

ちなみに、この”リニア”RGB というのが曲者で、画像は sRGB で入っている事が多くガンマ補正がかかっているので、実は微妙に明るさが期待したものより暗くなる事があります。 補間の問題なのでドットが疎らに入っている画像で特に暗くなる傾向があります。

厳密に処理したい場合は RGB にしてから処理すると良いでしょう。

$ convert earth_lights_4800.tif \
          -colorspace RGB -resize 500 --colorspace sRGB \
          earth_lights_colorspace.png

ImageMagick のオプションの順序に注意

  • ImageMagick は引数を先頭から順に命令実行する

以下のように、for ループで引数を先頭から順番に見て、オプションに対応する関数を個別に実行します。

  • wand/mogrify.c (convert も引数チェック後にこの関数を呼ぶ)
WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
  const char **argv,Image **image,ExceptionInfo *exception)
<略>
  for (i=0; i < (ssize_t) argc; i++)
  {
    option=argv[i];
    <略>
    switch (*(option+1))
    {
       <略>
      case 'r':
      {
         <略>
        if (LocaleCompare("repage",option+1) == 0)
          {
            if (*option == '+')
              {
                (void) ParseAbsoluteGeometry("0x0+0+0",&(*image)->page);
                break;
              }
            (void) ResetImagePage(*image,argv[i+1]);
            InheritException(exception,&(*image)->exception);
            break;
          }

逆にいうと順序次第で組み合わせ的に色んな操作が可能になるという事です。

補足したい項目

対応するブログのエントリを並べます。

画像比較は人間の眼で行うべし

ある程度、計算で差分の多い画像や領域を自動抽出できます。

Orientation を考慮しよう

JPEG を経由しなくても +repage で対処出来る。かもしれません。

透過画像を考慮しよう

結果は恐らく変わらないので重箱の隅付きですが、-extent は副作用的に対処出来るだけで、-flatten がズバリの処理です。

グレイスケール画像を考慮しよう

6.8.0-0 〜 6.8.0-7 にあった色空間変換のバグです。回避策として PNG24, PNG32 に変換するのも良いですが、減色が理由ではないので PNG8 でも良いかもしれません。

-define jpeg:size に注意

大きい方向にリサイズする時はメモリを余計に消費しますが、小さい方にリサイズする場合は大変有効ですので、是非使いましょう。元の 12 以下にリサイズする場合は jpeg:size をつける。という条件をつけるのが良さそうです。

さいごに

以上です。誤りや物足りない所があればご指摘ください。

もし、お役に立つ事があれば幸いです。