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);
注意
- font は、ImageMagickのバージョンによっては、カレントにフォントファイル(ttf)をコピーして指定しないとエラーになることがありました。私が以前確認した限りでは、WindowsNT4.0,ActivePerl5.005,ImageMagick4.21で、font指定の実行時エラーがでました。カレントにフォントをコピーして、font=>'arial.ttf' と指定したらエラーなく動作しました。
- 古いImageMagickでは、penという文字色を指定する引数属性がありましたが、strokeとfillという2つにわかれました。縁取りと塗りつぶしができます。
- x, y の座標の扱いもバージョンによってかなり違いがありました。これらは確認が容易ですので、そのバージョンごとに調べて適切な値を指定するようにしたほうがいいでしょう。
タイムスタンプを入れる
例えば、デジカメ画像に自動でタイムスタンプを入れたい!とか簡単にできます。以下は、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');
{{edit 更新履歴}}