Corredor

ウェブ、プログラミングの勉強メモ。

今更「ImageMagick」というモノを知った

こんな大御所老舗ツールを知らずに SE やってましたごめんなさい。

ImageMagick とは

f:id:neos21:20170325040344p:plain

イメージマジックとは、画像の解析、変換、さらには描画までができるツール。マルチプラットフォーム対応なので、Windows でも Mac でも Linux でも同様の機能が使える。外部に依存するライブラリ等が特になく、ImageMagick さえ入れてしまえば大抵の画像処理ができる。

コマンドラインで実行することができ、たとえば Web アプリケーションにおいて、ユーザがアップロードした画像ファイルを任意のサイズにまでリサイズしたりするときに使ったりできる。

現在も盛んに開発が進められており、バージョンが頻繁に上がっている様子。

今回は Windows 環境で触ってみた

今回は、Windows10 64bit 環境に ImageMagick の Ver.7 系をインストールして使ってみたい。

コマンドラインでの使い方は、一度覚えてしまえば Linux で使うときなんかも同じなので、OS 依存しなくて嬉しい。

ImageMagick のダウンロードとインストール

公式サイトは以下。

ダウンロードページは以下。

Windows の場合は「Windows Binary Release」のセクションまでスクロールし、本記事執筆時点の最新版である「ImageMagick-7.0.5-3-Q16-x64-dll.exe」をダウンロードする。インストーラになっているので、実行してインストールする。

インストールが完了すると、C:/Program Files/ 配下に ImageMagick-7.0.5-3-Q16 といったディレクトリができていると思う。このディレクトリが環境変数 PATH に追加されているはずなので、すぐにコマンドプロンプトなどから実行することができる。

バージョン6系と7系での大きな違い

ImageMagick V6 系と V7 系で、コマンドの名称が変更されているようだ。V6 系まで画像の変換には convert というコマンドが使われていたが、これが V7 系では magick というコマンドに変わった。

どうやら Windows 環境において、デフォルトの convert.exe (FAT ボリュームを NTFS に変換するコマンド) と衝突して鬱陶しかったために変更されたようだ。コマンド名称が異なるだけで、基本的なオプションは V6 系と V7 系で同じモノが使えるので、あまり気にならない。

なお、インストーラでのインストール時に「legacy utilities」をインストールするようにすれば convert.exe がインストールできるので、V7 系でも convert.exe が使える状態にできる。この場合、C:/Windows/System32/ 内で convert コマンドを叩いてしまうと、前述の Windows 標準の convert.exe という全く別のコマンドが走るため、現在地に注意。

コマンドラインから ImageMagick を扱ってみる

インストールが終わったら、いよいよ使い始めてみる。コマンドプロンプトを立ち上げる。

Rem 適当な作業ディレクトリに移動する
> Cd C:/work/

Rem サンプルで適当なロゴをデッチ上げる
> Convert logo: logo.gif

Rem Ver.7 以降は「convert」ではなく「magick」コマンドになる。オプションは同じ
> Magick logo: logo.gif

上記のコマンドは、【convert OR magick】 [元画像] [変換後画像] というコマンドで、第1引数にした logo: というのは ImageMagick が用意しているサンプルの画像を表す。第2引数に logo.gif と書いたので、作業ディレクトリ C:/work/ 配下に logo.gif が生成されている。

この魔法使いのドヤ顔ジイサン、何か人気みたい。w

画像を表示する displayimdisplay

さて、画像を表示するには、Windows の場合はこう書く。

Rem Windows だと imdisplay.exe を使う
> Imdisplay logo.gif

「Windows の場合は」と書いたとおり、元々は display というコマンドだった。コレも Windows 環境で衝突するコマンドがあったようで、Windows だと display は Delegate されていて使えず、imdisplay コマンドを使うようにとなっている。ImageMagickDisplay、ってことかな。

# Linux などは display。
$ display logo.gif

画像の変換 convertmagick

恐らく一番使うのが画像の変換コマンドだ。先程使った convertmagick コマンドには豊富なオプションがある。

Rem 基本構文
> Convert [オプション] before.jpg after.jpg

ざっと使えそうなオプションは以下のとおり。

  • -resize 100x100:width・height (横縦) をピクセル指定でリサイズ
  • -resize 100x:width だけ 100px・縦は縦横比を維持したサイズでリサイズ
  • -resize x100:height だけ100px・横は縦横比を維持したサイズでリサイズ
  • -quality 80:画質を指定できる
  • -strip:不要情報を削る

変換元ファイル名・変換後ファイル名はともに現在のディレクトリからの相対パス、もしくはフルパスで記載できる。

Rem 何かの写真を縮小してみる
Rem 横幅 1024px・縦は縦横比を維持するよう自動算出してくれる
Rem 画質は 100 にすると元画像より大きくなったりするので少し下げておく
Rem 「-strip」でメタ情報を削除してもらう
> Convert -resize 1024x -quality 80 -strip MyPhoto.jpg MyPhoto_Resized.jpg

こんな感じで変換できる。

画像の情報を取得 identify

その画像ファイルがどんなフォーマットなのか、という情報を、identify コマンドで調べることができる。

Rem 基本形
> Identify MyPhoto.jpg

任意のフォーマットで必要な情報のみ出力させることもできる。

Rem 「横 縦」で画像のサイズを取得
> Identify -format "%w %h" MyPhoto.jpg

Rem%e」は拡張子をただ返すだけ。
Rem%m」は画像の中身を解析した結果のフォーマットを返す。
Rem 拡張子偽装されているかを調べるなら「%m」が良い
> Identify -format "%e %m" MyPhotoJPG.gif

アニメーション GIF を読み取らせた場合、どうやら1コマ1コマの情報を取得して羅列して返却するので注意。

たとえば 640x320px の GIF アニメを -format "%w %h" というフォーマットで受け取ろうとすると、

640 320640 320 640 320……

というふうに、「1コマ目の高さ 320px」の情報と「2コマ目の幅 640px」の情報がくっついて出力されてしまう。

これを回避するには、-format "%w %h " というように末尾にスペースを入れたフォーマットなどすると良い。

-format オプションの書式については以下を参照。

より詳しい情報を出力させるには -verbose というオプションがある。

Rem 詳細情報も出力する
> Identify -verbose MyPhoto.jpg

こんなかんじ!

基本的なコマンドについてはこんな感じ。画像の変換処理はオプションが豊富でとても優秀。

Java で扱うには、コマンドラインのラッパーになってくれる im4java というライブラリを使うと扱いやすかった。次回書いてみようと思う。