|
ImageMagic(PerlMagic) |
- このコーナーは、ホームサーバ、自社サーバならではのグラフィックライブラリ、ImageMagickのインストールと、利用法をご紹介します。
On The Flyでは不可能なJPEGやPNG形式の画像を動的に作成、編集することができ、
アップロードされた画像をすべてJPEG形式のサムネイルでコピーする事も可能にします。
ImageMagickを使用すれば

こんなグラフも動的に作成できてしまいます。
本章ではWindowsのホームサーバを構築する事を目的としていますのでWindowsのインストールを解説します。
と言ってもWindowsの場合は、解説するまでもありません。5分もあれば終わってしまいます。
ImageMagicを使用した高度なサンプルはこちらに有ります。
※ImageMagickはPerlを拡張する必要がありますので、プロバイダや、レンタルサーバにご自分でインストールすることはできません。
| ImageMagickのインストール |
 |
- Command.comの起動
[スタート]メニューの「ファイル名を指定して実行」で、
とタイプしてDOSシェルを起動します。
C:\> ppm
PPM interractive shell (2.2.0) - type 'help' for available command
PPM> search magick
PPM> install Image-Magic
Install package 'Image-Magic?' (y/N): y
|
ppm とタイプして、PPM コマンドを起動します。
search magick で検索し、Image-Magick が表示されれば、
install Image-Magick でインストールしてください。
これでインストールは完了です。
あとは実際にインターフェースを作成してアクセスするだけです。
|
| ImageMagickを使ってみる |
 |
- インストールが終了すれば、perlからライブラリを操作して動的に画像を生成したり、編集できます。
ここで紹介するスクリプトは、Windowsに限らず、ImageMagickがインストールされたWebサーバであれば、
UNIXでもLinuxでも動作します。
次のサンプル画像は、450×356ピクセル、107KBのGIF画像です。
- サムネイルされた画像を生成
サンプル画像を出来るだけ解像度を落とさずにそのまま縮小しています。
ファイル形式はGIFのままですが、On The Flyと比べても非常に奇麗に生成されます。
#!/usr/local/bin/perl
# Transformは、同じ比率で画像を縮小拡大する
# 新しい幅だけ指定する
use Image::Magick;
$newwidth = 120;
$i = Image::Magick->new;
$i->Read('Skyline.gif');
$i = $i->Transform(geometry=>$newwidth);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("gif:-");
exit;
|
|
このサンプルで生成されたGIF画像は約14KBです。
- jpegに変換して生成
上記スクリプトとほとんど同じですが、ファイルに書き出す$i->Write('jpeg:-');の行だけが違っています。
jpegを指定する事で出力時にフォーマットを変換しています。
#!/usr/local/bin/perl
# Transformは、同じ比率で画像を縮小拡大する
# 新しい幅だけ指定する
use Image::Magick;
$newwidth = 120;
$i = Image::Magick->new;
$i->Read('Skyline.gif');
$i = $i->Transform(geometry=>$newwidth);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
ここで生成されたjpeg画像はわずか4KBしか有りません。
また、著作権にうるさいGIFをJPEGに変換して、さらにサイズまで1/3にしてくれるのですからGIFは使いづらくなります。
同様に「PNG:」を指定するとPNG形式に変換する事もできます。
- 幅と高さを指定
次の例では縦横比を無視し、指定した大きさで生成しています。
複数の画像を合成してサムネイルされた1枚の画像を生成する場合などに有効です。
#!/usr/local/bin/perl
# Scaleは、縦横のピクセルを与え縮小拡大する
use Image::Magick;
$newwidth = 160;
$newheight = 160;
$i = Image::Magick->new;
$i->Read('Skyline.gif');
$i->Scale(geometry=>geometry,width=>$newwidth,height=>$newheight);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 画像をぼかす
ここからは、さまざまなフィルターや効果を紹介します。
Blurは、指定したfactor値(0-99.9)で画像をぼかします。
$i->Blur(factor=>5);
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Blur(factor=>5);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 木炭画の効果
$i->Charcoal(factor=>3);
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Charcoal(factor=>3);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- エッジの抽出
$i->Edge(factor=>0.1);
#!/usr/local/bin/perl
use Image::Magick;
$newwidth = 120;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Edge(factor=>0.1);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 浮き彫り効果
$i->Emboss();
#!/usr/local/bin/perl
use Image::Magick;
$newwidth = 120;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Emboss();
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 上下反転
$i->Flip();
#!/usr/local/bin/perl
use Image::Magick;
$newwidth = 120;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Flip();
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 左右反転
$i->Flop();
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Flop();
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 枠の追加
Width、heightは、枠の幅と高さで、innerとouterは、立体表示させる幅と高さをピクセルで指定します。
$i->Frame(geometry=>geometry, width=>6, height=>6, inner=>2, outer=>2, color=>'#50FF50');
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Frame(geometry=>geometry,width=>6,height=>6,inner=>2,outer=>2,color=>'#50FF50');
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- ねじり効果
factorには、ねじり強度を%で指定します。
$i->Implode(factor=>'40%');
#!/usr/local/bin/perl
use Image::Magick;
$newwidth = 120;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Implode(factor=>'40%');
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 色反転
$i->Negate()で全ての色を反転し、オプションでグレイスケールだけを反転させる事もできます。
$i->Negate(gray=>1);
#!/usr/local/bin/perl
use Image::Magick;
$newwidth = 120;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Negate();
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 画像の回転
degreesで指定された角度で画像を回転します。degreesは、-360から360までの整数で、マイナスは左回りを指します。
cropに1を指定すると、元の画像の大きさを変えません。
sharpenに1を指定すると、同時にシャープフィルタを付加します。
$i->Rotate(degrees=>-30,crop=>0,sharpen=>1);
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Set(bordercolor=>'#FFFFFF');
$i->Rotate(degrees=>-30,crop=>0,sharpen=>1);
$i->Trim();
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- 影を付ける
画像に影を付けます。
$i->Shade(geometry=>geometry,azimuth=>50,elevation=>50,color=>0);
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Shade(geometry=>geometry,azimuth=>50,elevation=>50,color=>0);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- シャープ効果
$i->Sharpen(factor=>70);
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Sharpen(factor=>70);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- ソラリゼーション効果
$i->Solarize(factor=>70);
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Solarize(factor=>70);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
- ウェーブ効果
ウェーブ効果は、拡大しておかなければなりませんので、$i->Magnify();で縦横共に2倍に拡大しています。
$i->Wave('4x40');
#!/usr/local/bin/perl
use Image::Magick;
$infile = "transform.jpg";
$i = Image::Magick->new;
$i->Read($infile);
$i->Magnify();
$i->Wave('4x40');
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
|
|
|
|
|
|