コマンドラインからのグラフィックス操作

ImageMagickで反転、サイズ変更、回転などを行う

大規模なバッチ処理にはコマンドライン・ツールが一番ですが、イメージ操作も例外ではありません。コマンドラインやスクリプトで多くのファイルを簡単に処理できるということを、Web開発者やアドミニストレーターは高く評価しています。本稿では、プログラマーのMichael Stillが、1度に1つでも100個でも、たくさんのフォーマットにサイズ設定、回転、変換などのイメージ操作を行うことができるLinuxツールキットであるImageMagickスイートについて解説をいたします。

Michael Still (mikal@stillhq.com), Senior software engineer, Tower Software

Michael StillMichaelは、数年間オーストラリアの政府機関向けに大規模な画像データベースの管理や開発を行うなど、画像処理の分野に従事してきました。現在は世界最先端のEDMSやTRIMというレコード管理パッケージの製造を行うTower Software社に勤務しています。またオープン・ソースのPDF生成APIであるPandaや、他のオープンソース・コードの開発者でもあります。



2003年 7月 16日

この記事は、コマンドライン・ツールを使用して、イメージ操作を行なう方法の解説です。私は何台かのデジタル・カメラを手にして以来、数千のスナップ写真のライブラリーを管理しているので、よくこの作業を行っています。たくさんのイメージを何度も一括処理しなければならないWeb開発者やアドミニストレータにとって、開発者がスクリプトにイメージを組み入れることができるコマンドライン・ツールはとりわけ魅力的な選択肢となっています。一度か二度しか操作を行なわない場合でさえ、コマンドライン・ツールは時間の節約になります。

この記事で紹介するコマンドライン・ツールは、Red Hat Linuxに同梱されているオンラインで自由に利用できる優れたImageMagickスイートの一部です( 参考文献 を参照してください)。ImageMagickは、C、C++、Perl、Python、JavaなどLinuxプログラマーがよく理解している他の言語からも利用することができます。

ImageMagickの機能

ImageMagickは、libtiffやlibpngを含む異なるイメージ・ライブラリー群のラッパーとして実装されています(libtiffに関する私の初期の記事へのリンクは参考文献を参照してください)。ImageMagickの用語では、これらはdelegateと呼ばれます。これがImageMagickがカスタム・アプリケーションほどは速くない理由の1つです。これらのライブラリーがイメージ・データを表示するためのいろいろな方法に対処できるよう、ImageMagickは一般的な様式で記述されなければなりません。

この記事で紹介されていることを実現する方法は、他にもたくさん存在することに注意してください。ここでは、私が使用して役に立った方法について説明いたします。その他のツールが良くないというわけではありません。私が今、使用していて満足しているツールを紹介するということにすぎません。

この記事では、特定の問題について例をあげて説明する形式をとっていますが、その概念はその他の問題にも同じように適用できるはずです。

サムネールの生成

写真の収集において私が最初にしたことはサムネールを生成することでした。ほとんどの人々は1920ピクセル×1440のピクセルのままの私の息子の写真は見たくないでしょうから、Webサイト用にイメージのサイズを縮小したかったのです。

私はImageMagickスイートの convert ツールを使用しました。convert機能は本当に素晴らしいです。 Convert では、イメージサイズ変更に加えて、アンチ・エイリアス、イメージの平均化、ぼかし、画像フォーマットの変換、トリミング、ドット除去 、ディザリング、境界線の追加、反転、結合、リサンプル、サイズ変更などが可能です。コマンドライン・オプションの詳細についてはマニュアル・ページで確認してください。この記事の後の章で、 convert によって実現できる視覚的に面白い効果をいくつか説明いたします。

美しいバラのイメージのサムネールを作りたいとしましょう。

図1.バラの写真
A picture of a rose

convertでイメージのサイズを変更するには、-sampleというコマンドライン・オプションを使用します。例えば、サムネールを80×40ピクセルにしたい場合、コマンド・ラインは次のようになります。

# convert -sample 80x40 input.jpg output.jpg

これで、次のように見えるサムネールができます。

図2. サムネールでの最初の試み
A thumbnail of a rose

ImageMagickは、サイズ変更に際してイメージの縦横比を自動的に優先します。つまり、新しいイメージの縦横比は前のイメージの縦横比と同じになります。上記の例では、サイズ変更されたイメージは要求された80×40に代わり、実際には53×40となっています。出力イメージのサイズ指定には、%を使用することもできます。%指定は、入力イメージのサイズがはっきりと分からない場合や、新しいイメージを正確なサイズに指定する必要がない場合に便利です。%を使用した例を示しておきます。

# convert -sample 25%x25% input.jpg output.jpg

ここまでで、次のように見えるサムネールができました。

図3. サムネールでのもう一つの試み
A thumbnail of a rose

convertでは、ディレクトリー内のイメージをサムネールにすることができます。この記事はシェルスクリプトに関しての紹介ではありませんが、カレント・ディレクトリーにあるJPEGのサムネールを生成する方法の例も示しておくことにしましょう。

リスト1. カレント・ディレクトリー内のJPEGをすべてサムネイルにする
for img in `ls *.jpg`
do
  convert -sample 25%x25% $img thumb-$img
done

これで、元のJPEGファイル名の先頭にthumb-を付けたファイル名で、実際のイメージの25%のサイズのサムネイルが生成されます。


イメージ・ファイルに関する情報の取得

よく使われる他の操作にはイメージファイルの大きさの決定があります。例えば、前の例ではサムネールを作成するには、イメージの大きさを把握しておく必要があったでしょう。

このような目的のために、多くのイメージ・ライブラリーは素晴らしいツールを装備しています。例えばlibtiff には、TIFFファイルに関する次のような情報を表示するtiffinfoが同梱されています(私が以前寄稿したTIFFライブラリーの詳細については、 参考文献を参照してください)。

# tiffinfo sample.tif
リスト2. tiffinfoからの出力例
TIFF Directory at offset 0x146
  Image Width: 352 Image Length: 288
  Bits/Sample: 8
  Compression Scheme: Deflate
  Photometric Interpretation: RGB color
  Samples/Pixel: 3
  Planar Configuration: single image plane

これはtiffinfoを使用する方法の完璧な例ではありません。しかし、この出力例により、tiffinfoを使うと、イメージのサイズ、ピクセル密度(1サンプルあたりのビット数と、1ピクセルあたりのサンプル数の組合せ)、使用されている圧縮技術のような役に立つ情報を得られることが理解できるでしょう。

同じく、PNGファイルに関して同様な情報を返すpnginfoコマンドがあります。

# pnginfo sample.png
リスト3. pnginfoでの出力例
sample.png...
  Image Width: 640 Image Length: 480
  Bitdepth (Bits/Sample): 8
  Channels (Samples/Pixel): 3
  Pixel depth (Pixel Depth): 24
  Colour Type (Photometric Interpretation): RGB 
  Image filter: Single row per byte filter 
  Interlacing: No interlacing 
  Compression Scheme: Deflate method 8, 32k window
  Resolution: 0, 0 (unit unknown)
  FillOrder: msb-to-lsb
  Byte Order: Network (Big Endian)
  Number of text strings: 0 of 0

私は、BMP、GIF、JPEGのような他のフォーマット用の同じような機能のツールは知りません。しかし、ここでもidentifyというツールをもつImageMagickがまた救いの手として登場します。

# identify -verbose sample.png
リスト4. identifyでの出力例
Image: sample.png
  Format: PNG (Portable Network Graphics)
  Geometry: 640x480
  Class: DirectClass
  Type: true color
  Depth: 8 bits-per-pixel component
  Colors: 142360
  Filesize: 555.6k
  Interlace: None
  Background Color: grey100
  Border Color: #DFDFDF
  Matte Color: grey74
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  signature: 361fe70ae623ef6f1fca44e0d29d157c2d701039fcf0f8625862925d881e13a4
  Tainted: False
  User Time: 0.190u
  Elapsed Time: 0:01

identifyが、ピクセルでのイメージサイズ、イメージの色の濃さ、イメージ・フォーマットのようなイメージファイルに関する役に立つ情報を表示していることが分かるでしょう。

pnginfo

PNGを使用し始めた頃は、私はすでにかなり前からのlibtiffのユーザーでした。当時、PNGファイル用のtiffinfoに相当するものはありませんでした。それで、私はpnginfoを書いたのです。(参考文献のリンクからpnginfoをダウンロードすることができます)。

identify には、出力したい情報だけを指定することができる -format というコマンドライン・フラグがあります。例えば、イメージの大きさだけに関心があるのであれば、次のようなコマンドを使用します。

# identify -format "%wx%h" sample.png

出力は以下のようなものになります。

640x480

コマンドの %w はイメージの幅を、 %h はイメージの高さを意味しています。オプションで使用することができるフォーマット文字の詳細については、 identify のマニュアル・ページを確認してください。


イメージの回転

よく使われる他の操作には、イメージの回転があります。例えば、私のデジタルカメラで撮る写真の多くは、ポートレートとして撮られているので90度回転させられています。しかし私のカメラでは、これらを回転させることができません。したがって、私はカメラからイメージをダウンロードさせてから回転させるスクリプトを持っています。

例えば、これは最近タスマニアのPort Arthurへ旅行に行った際に、私が撮った写真です。

図4. 横向きのPort Arthur
A sideways picture of Port Arthur

この写真を回転させるためのconvertコマンドの話に再び戻ります。

# convert -rotate 90 input.jpg output.jpg

これで、イメージは次のように見えることになります。

図5. Port Arthur
A picture of Port Arthur

-rotate オプションの引数はイメージを右に回転させる度数であることに注意してください。左に回転させるには、負の数を使用してください。


イメージのフォーマット変換

convert コマンドでは、イメージファイルのフォーマット変換も行うことができます。これには、カラーからグレースケールへの変換、ディザリング変換などから、JPEGからPNGへのイメージ変換といった画像形式の変換までもが含まれています。

convert は、コマンドラインで与えられたファイル拡張子から、入出力の画像形式を把握することができます。したがって、JPEGをPNGに変換するためには、下記のようなコマンドラインを使用してください。

# convert input.jpg output.png

ImageMagickはこの記事を書いた時点では、89の画像形式をサポートしています。詳細はImageMagickのWebサイト( 参考文献 を参照)を確認してください。


イメージにテキスト注釈の追加

時には、イメージにテキスト注釈を加えたいこともあるでしょう。例えば、あなたの会社が標準的な名刺イメージを持っており、それを出力する前に各従業員の詳細を配置したいような場合や、あなたのWebサイトでオンライン・コースを合格したユーザーに授与証明書を生成するような場合などです。

では、次のイメージから始めるとしましょう。

図6. Floriade 2002の写真
Floriade 2002

下のコマンドラインを使用して、イメージにいくつかの識別情報で注釈を付けることができます。

# convert -font helvetica -fill white -pointsize 36 \
-draw 'text 10,50 "Floriade 2002, Canberra, Australia"' \
floriade.jpg comment.jpg

結果は次のようになります。

図7. Floriade 2002の注釈を付き写真
Floriade 2002 after annotation

これはこの記事でこれまでに示したコマンドラインの中では、最も複雑な convert です。ですので、少し説明をしましょう。

-font helvetica は注釈のフォントをHelveticaにセットします。また、ここにフォントファイルへのパスを指定することもできます。許可されていない他のWebサイトがそれを再使用することができないように、この例はイメージにバッジを付けています、しかし、それは非標準の場所にあるフォントを使用します。

# convert -font fonts/1900805.ttf -fill white -pointsize 36 \
-draw 'text 10,475 "stillhq.com"' \
floriade.jpg stillhq.jpg

結果は次のようになります。

図8. バッジを付けられたイメージ
Floriade after badging

-fill whiteは文字を標準の黒の代わりに白で記入するよう指定しています。

-pointsize 36は、文字のサイズをポイントで指定しています。1インチは72ポイントです。

-draw 'text 10,50 "..."'は描画コマンドです。この場合、位置10,50へ移動して、そして、ダブルクォートで囲まれた文字を描きます。1語以上を描く場合、描画コマンド内に二重引用符が必要となるので、単一引用符が使用されます。また、二重引用符内に二重引用符を使用することはできません。


より芸術的なconversion

convertは他にいくつかの芸術的な変換を行うことができます。ここでは視覚的に面白いもののいくつかをデモンストレートしましょう。興味がある方は、ImageMagickのマニュアル・ページやWebサイトで詳細を確認してください。これがデモンストレートに使用するイメージです。

図9. 日没のウルル国立公園
Uluru

エアーズロックとしてよく知られているウルル国立公園のこの写真は、日没に撮影されました。

Charcoal

Charcoal効果では、イメージをCharcoal芸術のようにシミュレートできます。

# convert -charcoal 2 input.jpg output.jpg

結果はこのようになります。

図10. Charcoal 効果が適用された日没のウルル国立公園
Uluru after a charcoal effect

-charcoalオプションの引数を大きくすると、イメージへの「charcoal」の量が増加するだけでなく、イメージの生成が遅くなります。さらに、charcoal画法の例をあげておきます。

# convert -charcoal 10 input.jpg output.jpg

これによって、次の結果が得られます。

図11. より多くのCharcoal効果が適用された日没のウルル国立公園
Uluru after more charcoal effect

Charcoalをもっとワイルドにしたい場合は。

# convert -charcoal 200 input.jpg output.jpg

結果は次のようになります。

図12. 極端なCharcoal効果の日没のウルル国立公園
Uluru after even more charcoal effect

3つの値の指定

赤、緑、青の3つの値を指定するためには、赤/緑/青 の形式を使用します。例えば、10/20/30は、赤が10、緑が20、青が30の値であることを意味します。この指定には、%を使用することもできます。

Colorize

Colorizingは、指定された色で各ピクセルの色を混ぜ合わせるプロセスです。引数は混ぜる色です。(赤、緑、青それぞれで使用される)割合を指定することもできますし、3つの割合として指定することもできます。さらに、3つの実際の値から1つを指定することも可能です。

# convert -colorize 255 input.jpg output.jpg

ウルル国立公園がカラー化されると次のようになります。

図13. 色付けされた日没のウルル国立公園
Uluru after a colorizing effect

Implode

Implode効果は、仮想ブラックホールへ吸収されていくようなイメージをシミュレートします。引数はImplode効果を期待する値です。

# convert -implode 4 input.jpg output.jpg

Implodeをしたウルル国立公園は次のようになります。

図14. Implodeを行った日没のウルル国立公園
Uluru after an implosion effect

solarize引数

ImageMagickドキュメンテーションでは、solarizeの引数は常に%であると書かれています。これは厳密には真実ではありません。引数の終わりが%となっていれば%として扱われ、そうでなければ、文字として扱われます。

Solarize

Solarizeは、写真の現像プロセスでネガが感光される場合に生じる効果です。ここでの入力引数は効果を加える強さです。絶対値、あるいはピクセルに許容された最大値との割合で指定できます。ピクセルが限界値より大きい場合、指定した値は無効となります。

# convert -solarize 42 input.jpg output.jpg

Solarizeをすると、イメージは次のようになります。

図15. Solarizeを行った日没のウルル国立公園
Uluru after a solarization effect

Spread

Spread は、イメージ内で適宜ピクセルを広げます。引数は、新たにぼかすピクセルの周囲のサイズです。したがって、出力と入力が非常に似ていることは明らかです。

# convert -spread 5 input.jpg output.jpg

Spreadをしたウルル国立公園は次のようになります。

図16. Spreadをした日没のウルル国立公園
Uluru after a spreading effect

1回のImageMagick呼出しでの複数のコマンドの実行

すでに、テキスト注釈追加の章で、コマンドを連結する例を見てきました。しかし、この記事で言及されたImageMagickコマンドのうちのどれでも連結をさせることができます。例えば、イメージのサムネールを作ったら、次に、それにspreadを適用したくなるかもしれません。Spreadをしたら、Charcoal効果を適用したくなるかもしれません。

# convert -sample 25%x25% -spread 4 \ -charcoal 4 input.jpg output.jpg

この結果は次のようになります。

図17. コマンド連結結果のウルル国立公園
Uluru after a chain of effects

イメージ操作のためのヒント

慌てて所有しているすべてのイメージを修正し始める前に、イメージ操作に関して覚えておくべきことがあります。後で後悔するようなフォーマットで多くのイメージを作成してしまう前に、まず、どの画像形式を長期で使用するつもりであるかを考えるべきです。この記事ですでに紹介したイメージのフォーマットを変換する convert を使用することができるので、これはとりわけ簡単です。

JPEG圧縮は写真のような大規模なイメージによく用いられます。しかしながら、圧縮には通常損失があります。(言い換えれば、イメージデータは圧縮プロセスの一部として失われます)。つまり、判読可能なままである必要があるテキストの圧縮には、JPEGはむいていないということです。心に留めておくべきもう1つのことは、損失は累積的であるということです。

PNGは、一連の操作を行っても、蓄積する損失によってイメージの品質を落としたくないカラーイメージに最適です。

このトピックについての詳細は、libtiffでカラー画像を扱っている私の寄稿記事「libtiffによるグラフィックス・プログラミング: 第2回」記事を参照してください( 参考文献 を参照)。

さらに、この記事で示されるほとんどの操作が一方向であることを覚えておいてください。例えば、一度イメージを縮めたならば、そのイメージ・データはなくなります。後で再びイメージを引き伸ばせば、出力は完全に画素化されます。例えば、写真を撮り、サムネールを作って、再びイメージを拡張していくとしましょう。元のイメージ・データが必要な場合は、サムネイルの前にイメージ・データを保存します。

図18. ケアンズの滝
A waterfall

ここでは、拡大と減少をつないでみましょう。

# convert -sample 10% -sample 1000% input.jpg output.jpg

これは、類似に見えるイメージを生産します。

図19. 濃淡のむらがある滝
A blocky waterfall

目の焦点を合わせないと見えるようになるかもしれませんが、完成した写真で滝を見ることはかなり難しいです。


結論

この記事では、コマンドラインからImageMagickが実現できる面白いことのうちのいくつかを紹介いたしました。ここで紹介されたツールが、すべての問題に対する答えだとは限りません。また、時には、コードが必要となってくるでしょう。しかし、一般的なコマンドライン・ツールにより、しばしば多くの仕事を保存することができるのです。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=228572
ArticleTitle=コマンドラインからのグラフィックス操作
publish-date=07162003