わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ImageMagick 7のmagickコマンドを試す

TeX Wikiの8月2日付けにImageMagickというエントリが作られていました.ImageMagickは,ちょっとした画像を作ったり,加工したりするときに,よくお世話になっていて,当ブログでもたびたび,自作のワンライナーを紹介してきました.
エントリの中身を見ると,

重要! Windows のシステムには C:\Windows\System32\convert.exe という「FAT ボリュームを NTFS に変換するコマンド」が存在します. ImageMagick 6.9.3-9 以前の画像変換コマンド名は convert でしたので,これと Windows の convert を混同しないように注意が必要です.

を見ておおと思ったり

なお,ImageMagick 7 以降,この convert というプログラム名は廃止されて magick に名称変更されています.

を見てへえと思ったりしました.ともあれ使ってみましょう.
http://imagemagick.org/script/binary-releases.php#windowsより,最初のファイル名(ImageMagick-7.0.2-6-Q16-x64-dll.exe)をHTTPでダウンロードしました.インストール時に,"Select Additional Tasks"という,オプション選択が出ました.

この中の"Install legacy utilities (e.g. convert)"にチェックを入れて(つまりconvertコマンドは使えるようにして),Nextのボタンを押し,インストールをしました.
C:\Program Files\ImageMagick-7.0.2-Q16に格納されました.ふだん,コマンド実行で使っているのはCygwinなので,次のコマンドを実行してパスを追加しました.

$ PATH=/cygdrive/c/Program\ Files/ImageMagick-7.0.2-Q16:$PATH

実行ファイルを確認しておきます.

$ which convert magick
/cygdrive/c/Program Files/ImageMagick-7.0.2-Q16/convert
/cygdrive/c/Program Files/ImageMagick-7.0.2-Q16/magick
$ ls -Fl "$(which convert)" "$(which magick)"
-rwxr-x---+ 1 Administrators なし 112128 7月 30 06:11 '/cygdrive/c/Program Files/ImageMagick-7.0.2-Q16/convert'*
-rwxr-x---+ 1 Administrators なし 112128 7月 30 06:11 '/cygdrive/c/Program Files/ImageMagick-7.0.2-Q16/magick'*
$ md5sum "$(which convert)" "$(which magick)"
6e3651e10360f6783657c143d52ea574 */cygdrive/c/Program Files/ImageMagick-7.0.2-Q16/convert
18fefe8530d4b245702fa8f464e188a2 */cygdrive/c/Program Files/ImageMagick-7.0.2-Q16/magick

convertコマンドもmagickコマンドも,(Cygwinのパスでは)/cygdrive/c/Program Files/ImageMagick-7.0.2-Q16にあり,ファイルサイズは同じだけれども,中身は異なる*1と分かりました.
出来上がる画像に,違いはあるでしょうか.今回インストールしたmagickコマンドとconvertコマンド,そしてCygwinで以前より使用可能だったconvertコマンドとで,比較してみました.Re: 右ローテートとトランスポーズ,との3a.pngを生成するコマンドを使います.-qualityオプションなしと「-quality 94*2」をしてみました.

$ magick -size 200x120 xc:white -stroke blue -strokewidth 2 -fill none -draw "polyline 20,20 20,100 60,20 60,100 100,20 100,100 140,20 140,100 180,20 180,100" -strokewidth 1 -draw "stroke-dasharray 2 4 path 'M 40,2 v 200' path 'M 80,2 v 120' path 'M 120,2 v 120' path 'M 160,2 v 120' path 'M 0,40 h 200' path 'M 0,80 h 200'" 3a_magick.png

$ convert -size 200x120 xc:white -stroke blue -strokewidth 2 -fill none -draw "polyline 20,20 20,100 60,20 60,100 100,20 100,100 140,20 140,100 180,20 180,100" -strokewidth 1 -draw "stroke-dasharray 2 4 path 'M 40,2 v 200' path 'M 80,2 v 120' path 'M 120,2 v 120' path 'M 160,2 v 120' path 'M 0,40 h 200' path 'M 0,80 h 200'" 3a_convert.png

$ /usr/bin/convert -size 200x120 xc:white -stroke blue -strokewidth 2 -fill none -draw "polyline 20,20 20,100 60,20 60,100 100,20 100,100 140,20 140,100 180,20 180,100" -strokewidth 1 -draw "stroke-dasharray 2 4 path 'M 40,2 v 200' path 'M 80,2 v 120' path 'M 120,2 v 120' path 'M 160,2 v 120' path 'M 0,40 h 200' path 'M 0,80 h 200'" 3a_oldconvert.png

$ magick -size 200x120 xc:white -stroke blue -strokewidth 2 -fill none -draw "polyline 20,20 20,100 60,20 60,100 100,20 100,100 140,20 140,100 180,20 180,100" -strokewidth 1 -draw "stroke-dasharray 2 4 path 'M 40,2 v 200' path 'M 80,2 v 120' path 'M 120,2 v 120' path 'M 160,2 v 120' path 'M 0,40 h 200' path 'M 0,80 h 200'" -quality 94 3a_magick_94.png

$ convert -size 200x120 xc:white -stroke blue -strokewidth 2 -fill none -draw "polyline 20,20 20,100 60,20 60,100 100,20 100,100 140,20 140,100 180,20 180,100" -strokewidth 1 -draw "stroke-dasharray 2 4 path 'M 40,2 v 200' path 'M 80,2 v 120' path 'M 120,2 v 120' path 'M 160,2 v 120' path 'M 0,40 h 200' path 'M 0,80 h 200'" -quality 94 3a_convert_94.png

$ /usr/bin/convert -size 200x120 xc:white -stroke blue -strokewidth 2 -fill none -draw "polyline 20,20 20,100 60,20 60,100 100,20 100,100 140,20 140,100 180,20 180,100" -strokewidth 1 -draw "stroke-dasharray 2 4 path 'M 40,2 v 200' path 'M 80,2 v 120' path 'M 120,2 v 120' path 'M 160,2 v 120' path 'M 0,40 h 200' path 'M 0,80 h 200'" -quality 94 3a_oldconvert_94.png

$ ls -Fl 3a*.png
-rwx------+ (略) 2057 (略) 3a_convert.png*
-rwx------+ (略) 1639 (略) 3a_convert_94.png*
-rwx------+ (略) 2057 (略) 3a_magick.png*
-rwx------+ (略) 1639 (略) 3a_magick_94.png*
-rw----r--+ (略) 1814 (略) 3a_oldconvert.png
-rw----r--+ (略) 1497 (略) 3a_oldconvert_94.png

ファイルサイズは,古いバージョンで作ったほうがやや小さいです.画像を見比べると,点線の太さが違っています.3a_magick.pngだと,こうです.

それに対し,3a_oldconvert.pngは,こうです.

そうだ思い出した,ここで,3つの実行コマンドのバージョン情報を見ておきましょう.

$ magick --version
Version: ImageMagick 7.0.2-6 Q16 x64 2016-07-30 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Visual C++: 180040629
Features: Cipher DPC Modules OpenMP
Delegates (built-in): bzlib cairo flif freetype jng jp2 jpeg lcms lqr openexr pangocairo png ps rsvg tiff webp xml zlib

$ convert --version
Version: ImageMagick 7.0.2-6 Q16 x64 2016-07-30 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Visual C++: 180040629
Features: Cipher DPC Modules OpenMP
Delegates (built-in): bzlib cairo flif freetype jng jp2 jpeg lcms lqr openexr pangocairo png ps rsvg tiff webp xml zlib

$ /usr/bin/convert --version
Version: ImageMagick 6.9.3-10 Q16 x86_64 2016-05-04 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC OpenMP
Delegates (built-in): autotrace bzlib cairo fftw fontconfig fpx freetype gslib jbig jng jpeg lzma pangocairo png ps rsvg tiff webp x xml zlib

新しいバージョンの(C)の年が2015までなのにはちょっと驚きました.
フォントの扱いも,確認しておきますか.今度は,右ローテートとトランスポーズの「(2)(a)の画像」です.

$ cp /cygdrive/Windows/Fonts/msgothic.ttc .

$ ruby -e "print %w(e291a0e291a3e291a6e291a9e291ac0ae291a1e291a4e291a7e291aae291ad0ae291a2e291a5e291a8e291abe291ae).pack('H*')" > 2a.txt

$ magick -background white -fill blue -font msgothic.ttc -pointsize 40 label:@2a.txt -quality 94 2a_magick.png

$ convert -background white -fill blue -font msgothic.ttc -pointsize 40 label:@2a.txt -quality 94 2a_convert.png

$ /usr/bin/convert -background white -fill blue -font msgothic.ttc -pointsize 40 label:@2a.txt -quality 94 2a_oldconvert.png

今回も,ファイルサイズは2a_magick.pngと2a_convert.pngは同じで,2a_oldconvert.pngは100バイトほど小さくなりました.ただし画像サイズは,前二者が201x121,後者は202x121です.出来上がり画像を並べておきます.


なお,はじめにcpコマンドでMS ゴシックのフォントをコピーしているのは,新たにインストールしたImageMagickCygwinのコマンドとで,パスの扱いが異なるのを回避するためです.
ファイル指定とは別に,利用可能なフォントを知るには,「magick -list font」のコマンドです.出力をざっと見ると,

  Font: MS-Gothic-&-MS-UI-Gothic-&-MS-PGothic
    family: MS Gothic & MS UI Gothic & MS PGothic
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: c:\windows\fonts\msgothic.ttc
  Font: MS-Mincho-&-MS-PMincho
    family: MS Mincho & MS PMincho
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: c:\windows\fonts\msmincho.ttc

と出まして,msgothic.ttcがカレントディレクトリにない状態で,

$ magick -background white -fill blue -font 'MS-Gothic-&-MS-UI-Gothic-&-MS-PGothic' -pointsize 40 label:@2a.txt -quality 90 2a_magick.jpg

というコマンドでも,同じ画像が作れました.「/usr/bin/convert -list font」ではこのフォント情報が出て来ず,「/usr/bin/convert ... -font 'MS-Gothic-&-MS-UI-Gothic-&-MS-PGothic' ...」はエラーが出ました.
他にもいくつか試しましたが,コマンドレベルでの互換性はあるものの,生成されるファイルは新旧のバージョンで少し異なると思っておいてよさそうです.
ところで,ImageMagickのインストールにより,file:///C:/Program%20Files/ImageMagick-7.0.2-Q16/index.htmlがブラウザで読めるようになりました.Features and Capabilities以降に出てくる各リンクは,file://のものもあれば,ImageMagickサイトへ飛ぶものもあります.
ページ左上のおじいさんの画像(wizard.png)は,バージョン7で作り替えられたのかなと予想しながら,少し調べてみると,2011年に書かれたImageMagickのおじいさんがドヤ顔しているイラストください: やりくりんごに新旧画像がありまして,予想はハズレでした.

*1:違いはコマンド名でしょうか.

*2:これより大きくすると,画像のファイルサイズが大きくなりました.なお,91から94まではいずれも同じ(バイト数)で,90は,-qualityオプションなしと同じとなりました.