FrontPage 新規 編集 検索 一覧 ヘルプ

ImageMagick

ImageMagickの目次

ImageMagickとは?

非常に多くの画像フォーマットに対応している超強力な画像処理ライブラリです。

無料レンタルサーバでもインストール済みのプロバイダが結構あり、CGIで動的に画像をゴニョゴニョしたりできます。(^^)

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

http://www.imagemagick.org/ のダウンロードボタンを押すとダウンロードサイトの一覧が表示されます。私の場合、お手軽にWindowsのバイナリパッケージを利用してしまいます。ImageMagick-5.5.7-Q8-windows-dll.exe をダウンロードしてインストール。インストールオプションは全てにチェックを付けると、Perl5.8用のPerlMagickと、WSHなどで利用できるCOM+コンポーネントなども一緒にインストールされます。

Perl/CGIでの使い方

CGIで画像を変換したい場合は、Image::MagickのPerlインターフェースであるPerlMagickを利用するとよいでしょう。

VBScript/WSHでの使い方

COMコンポーネントを登録します。デフォルトのインストールなら、C:\Program Files\ImageMagick-5.5.7-Q8\ImageMagickObject\ImageMagickObject.dll がコンポーネントのパスです。コマンドプロンプトを開き、

 regsvr32 "C:\Program Files\ImageMagick-5.5.7-Q8\ImageMagickObject\ImageMagickObject.dll"

と入力するとレジストリに登録され利用できるようになります。

登録したら、tests フォルダを開きます。そこに SimpleTest.vbs というプログラムがあります。実行してみましょう。実行すると、logo.jpg というImageMagickのロゴファイルをJPEGいにコンバートして作成します。

画像を変換したい!

プロンプトで変換

単純な変換なら、DOSプロンプトでconvert命令を使うのが楽です。

 > convert hoge.bmp hoge.jpg

こうすると、hoge.bmp を hoge.jpg に変換してくれます。

Perlで変換

PerlMagickで変換するには、まずImage::Magickのインスタンスを生成します。そして、Read()で画像を読み込み、読み込んだ画像に対して色々な操作を行うのが基本である。サンプルは、logo.jpg を読み込んで、128x96のサムネール(logos.jpg)を生成します。

 #!/usr/bin/perl -w
 # ImageMagickサンプル
 # Windows2000, ActivePerl5.8, ImageMagick5.5.7 で動作確認
 
 use strict;
 use Image::Magick;
 
 # バージョン表示
 #print $Image::Magick::VERSION;
 
 my($image, $status);
 # インスタンス生成
 $image = Image::Magick->new;
 
 # 画像読み込み
 $status = $image->Read('logo.jpg');
 warn($status) if($status);
 
 # 画像リサイズ
 $image->Scale('128x96');
 
 # 画像書き出し
 $status = $image->Write('logos.jpg');
 warn($status) if($status);
 
 # オブジェクト破棄
 undef $image;

VBSで変換

VBScriptで変換する場合もImageMagickのインスタンスを作成しますが、PerlMagickのように細かいメソッドは無く、Convertを使って変換します。Convertの引数を変えるだけで、色々細かい変換が可能です。ASPなどでも利用できます。

 Set objImg = CreateObject("ImageMagickObject.MagickImage.1")
 msgs = objImg.Convert("-geometry", "64x64", Server.MapPath("hoge.jpg"), Server.MapPath("thamb.jpg"))
 Set objImg = Nothing

ASPで変換

VBSとやり方は一緒です。ASPでのサンプルを作成したので載せておきます。このサンプルは指定ディレクトリ内の全てのファイルのサムネイルを作成して、サムネイルを一覧表示して、元の画像ファイルにリンクをはります。

 <%  @LANGUAGE="VBSCRIPT" %>
 <%
 Option Explicit
 
 Const ALBUM_DIR     = "photo"
 Const ALBUM_THUMB   = "thumb"
 Const SCALE         = "10%"
 
 Dim objImg
 Set objImg = Server.CreateObject("ImageMagickObject.MagickImage.1")
 
 Dim objFS, objFolder
 Set objFS = Server.CreateObject("Scripting.FileSystemObject")
 Set objFolder = objFS.GetFolder(Server.MapPath(ALBUM_DIR))
 MakeThumb objFolder
 
 Set objImg = Nothing
 
 Sub MakeThumb(objFolder)
     Dim objFile, objSubFolder
 
     For Each objFile In objFolder.Files
         objImg.Convert "-resize", SCALE, objFile.Path, _
                 objFS.BuildPath(Server.MapPath(ALBUM_THUMB), objFile.Name)
     Next
     For Each objSubFolder In objFolder.SubFolders
         MakeThumb objSubFolder
     Next
 End Sub
 
 %>
 <HTML>
 <HEAD>
 <TITLE>サンプルアルバム</TITLE>
 </HEAD>
 <BODY>
 <H1>アルバム</H1>
 <%
 Dim objFile
 For Each objFile In objFolder.Files
     Response.Write "<A href =" & ALBUM_DIR & "/" & objFile.Name & ">"
     Response.Write "<IMG src=" & ALBUM_THUMB & "/" & objFile.Name & " border=0>"
     Response.Write "</A>" & vbCrLf
 Next
 Set objFile   = Nothing
 Set objFolder = Nothing
 Set objFS     = Nothing
 %>
 </BODY>
 </HTML>

画像に文字を乗せたい!

画像に文字を載せるには、Annotate()を使います。annotate()はImageMagickのバージョンによって引数などに若干違があります。

 $image->Annotate(font=>'C:\Windows\Fonts\arial.ttf', pointsize=>20, fill=>'white', text=>'TEXTTEXTTEXTTEXT', x=>200, y=>150);

注意

タイムスタンプを入れる

例えば、デジカメ画像に自動でタイムスタンプを入れたい!とか簡単にできます。以下は、PerlMagickを使ったサンプルです。更新時刻をファイルから取得し、画像の右下に取得した時刻を乗せます。サンプルは1ファイルのみに実行していますが、フォルダ内のファイルに一括で適用したりすると便利です。

 #!/usr/bin/perl -w
 # timestamp.pl - PerlMagickでタイムスタンプを入れる
 # Windows2000, ActivePerl5.8, ImageMagick5.5.7 で動作確認
 use strict;
 use Image::Magick;
 
 my $READ_FILE  = 'logo.jpg';
 my $WRITE_FILE = 'logow.jpg';
 my $FONT       = 'C:\WINNT\Fonts\arialbd.ttf';
 my $POINT      = 20;
 my $STROKE     = 'red';
 my $FILL       = 'orange';
 
 # ファイルの更新時刻(乗せる文字列取得)
 my $time = (stat($READ_FILE))[9];
 my($sec, $min, $hour, $day, $mon, $year) = localtime($time);
 my $strtime = sprintf("%4d/%2d/%2d %2d:%2d:%2d",
         $year+1900, $mon+1, $day, $hour, $min, $sec);
 
 # 乗せる部 
 my($image, $status, $width, $height);
 $image = Image::Magick->new;
 
 $status = $image->Read($READ_FILE);
 warn($status) if($status);
 
 $width  = $image->Get('width');
 $height = $image->Get('height');
 $status = $image->Annotate(
                 font      => $FONT,
                 pointsize => $POINT,
                 text      => $strtime,
                 stroke    => $STROKE,
                 fill      => $FILL,
                 x         => $width - $POINT * 10,
                 y         => $height - $POINT);
 warn($status) if($status);
 
 $status = $image->Write($WRITE_FILE);
 warn($status) if($status);
 
 undef $image;

画像にいろいろなフィルターをかけたい!

百聞は一見にしかず・・・。いろいろな処理後の画像が掲載されています。ウマー。

画像

↑この画像は、PerlMagick\demo\demo.plを実行すると作成されるdemo.jpgと同じです。demoフォルダには、色々なサンプルが入っているので参考になるでしょう。

画像の情報を知りたい!

画像を生成する

何もないところから、ビルトインイメージを使って画像を生成してみます。

http://www.imagemagick.org/www/formats.html

現バージョン(5.5.7)では、みかげ調(granite:)とバラ(rose:)とロゴ(logo:) があるので、それをReadします。(プラズマやグラデーションはどこいった?:-( )下記サンプルは、みかげ調を読み込み、○と枠をつけてsample.pngに書き出します。

 #!/usr/bin/perl -w
 # imgcreat.pl - 画像を生成するサンプル
 # Windows2000, ActivePerl5.8, ImageMagick5.5.7 で動作確認
 use strict;
 use Image::Magick;
 
 my($image, $status);
 # インスタンス生成
 $image = Image::Magick->new;
 
 # 画像読み込み
 $status = $image->Read('GRANITE:');
 # $status = $image->Read('ROSE:');   # 何故かバラの画像もあるのさ
 warn "$status" if "$status";
 
 # ○を描画
 $image->Draw(primitive=>'Circle', points=>'60,60 80,80',
              linewidth=>5, stroke=>'red', fill=>'pink');
 
 # 枠でもつけてみるか・・・
 $image->Frame(geometry=>'5x5', inner=>1, outer=>2);
 
 # 画像書き出し
 $status = $image->Write('sample.png');
 warn "$status" if "$status";
 
 # オブジェクト破棄
 undef $image;

パターンを読み込むなら以下のようにします。

 $image->Read('PATTERN:BRICKS');
Yesterday Today Total