今更「ImageMagick」というモノを知った
こんな大御所老舗ツールを知らずに SE やってましたごめんなさい。
ImageMagick とは
イメージマジックとは、画像の解析、変換、さらには描画までができるツール。マルチプラットフォーム対応なので、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
画像を表示する display
・imdisplay
さて、画像を表示するには、Windows の場合はこう書く。
Rem Windows だと imdisplay.exe を使う
> Imdisplay logo.gif
「Windows の場合は」と書いたとおり、元々は display
というコマンドだった。コレも Windows 環境で衝突するコマンドがあったようで、Windows だと display
は Delegate されていて使えず、imdisplay
コマンドを使うようにとなっている。ImageMagickDisplay、ってことかな。
# Linux などは display。
$ display logo.gif
画像の変換 convert
・magick
恐らく一番使うのが画像の変換コマンドだ。先程使った convert
・magick
コマンドには豊富なオプションがある。
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 というライブラリを使うと扱いやすかった。次回書いてみようと思う。
- 参考 : Imagemagickの使い方日本語マニュアル – 日本語のマニュアルが少ない画像加工ツールImageMagickの使い方を、初心者の方にも解りやすいよう詳しく丁寧に解説しています。 … 画像処理についてはこのサイトが分かりやすい。
- 参考 : サーバーログイン時に超力技でドット絵を表示する - Qiita … こんな力技に使ったりも…。
書いた。