このエントリーをはてなブックマークに追加

Memo

Perl::ImageMagickでよく使うコマンドとサンプル

2012/09/11
Memo

Perl::ImageMagickでよく使うコマンドとサンプル

最近作ったwebサービス、pattren*makerをはじめ、ImageMagickを使ったサービスで遊んでいるを作っているひつじさんです。
それこそPerlを触るようになった6〜7年前くらいからImageMagickと戯れているんですが、使ってるよーって人をあまり見ないような…(サービスの裏側なんてまぁ普通は見せないもんですよね)

需要はあまりない?だけど、便利なImageMagick

きっかけはPCでも携帯(ガラケー)でも見れる写真サイトをやりたかったんです。
PCでは大きいサイズ、携帯では携帯用サイズに自動変換。
探せばそういうサイトもあったんですが、PCでの見た目がイマイチで、自分でそういう仕組みを作ってしまおう!と。
ちょうどPerlを勉強していた事もあり、なんとか自作してすごく満足してましたね。
(そのサイトをやるため、ImageMagickが使いたくて、月額500円の有料サーバを借りました。その頃はそこぐらいしかImageMagickが入ってなかったんです)
勉強していた当時もそうですが、日本語の解説サイトってあんまりないんですよね。
探しまくって探しまくって、すごく分かりやすい日本語のサンプル集を見つけたんですが、いつの間にか無くなっていてしょんぼりです。
自分でよく使うくせに、しばらくすると忘れてしまうんで、ふと思い立った時に使える用のサンプルを自分で用意してみました。

よく使うサンプル集

使用した元画像)
 
※猫写真は無料写真素材ぱくたそさんからお借りしました

画像の読み込み&表示
#!/usr/local/bin/perl

## 画像の読み込み&表示

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名
my $image = Image::Magick->new;
$image->Read("$filename");

print ("Content-type: image/jpeg\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("jpeg:-");
print "\n\n";

undef $image;
exit();

実行結果)

画像の読み込み&書き出し
#!/usr/local/bin/perl

## 画像の読み込み&書き出し

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名
$filename2 = "./test.jpg";     #書き出すファイル名

my $image = Image::Magick->new;
$image->Read("$filename");
$image->Write("$filename2");

# ブラウザ出力
print "Content-type: text/html\n\n";
print "Complete!";

undef $image;
exit();

実行結果)
サンプル2
※リンク先では「Complete!」しか表示されませんが、きちんとtest.jpgが書き出されています。

フォーマット変更
#!/usr/local/bin/perl

## フォーマットの変更

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名
my $image = Image::Magick->new;
$image->Read("$filename");

print ("Content-type: image/gif\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("gif:-");
print "\n\n";

undef $image;
exit();

実行結果)

分かりにくいですが、jpeg画像がgif画像として表示されています。
書き出す際の「print (“Content-type: image/gif\n\n”); 」と「$image->Write(“gif:-“);」をpngにすればpng画像として表示することもできます。

サイズ変更
#!/usr/local/bin/perl

## サイズ変更

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名
my $image = Image::Magick->new;
$image->Read("$filename");

my ($width, $height) = $image->Get('width', 'height');     #画像の幅、高さを取得する
$width = int($width / 2);
$height = int($height / 2);
$image->Scale(width=>$width,height=>$height);     #サイズを変更

print ("Content-type: image/jpeg\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("jpeg:-");
print "\n\n";

undef $image;
exit();

実行結果)

今回は「Scale」を使っていますが「Resize」というコマンドもあります。

画像を重ねる
#!/usr/local/bin/perl

## 画像を重ねる

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名
$filename2 = "../img/perlmagick2.png";     #重ねる画像ファイル名

#ファイルを読み込む
my $image = Image::Magick->new;
$image->Read("$filename");

#重ねる画像を読み込む
my $image2 = Image::Magick->new;
$image2->Read("$filename2");

#画像を重ねる(xとyの数値を変えることで位置を変更)
$image->Composite( image=>$image2, compose=>'over', x=>200, y=>80);

print ("Content-type: image/jpeg\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("jpeg:-");
print "\n\n";

undef $image;
undef $image2;
exit();

実行結果)

重ねる画像を半透明にしたい時は18行目辺りを以下のように

#画像を重ねる(opacityの数値で重ねる画像の透明度を変更)
$image->Composite( image=>$image2, compose=>'Dissolve', x=>200, y=>80, opacity=>'50%');

実行結果)

「compose=>’Dissolve’」の部分をオーバーレイ(Overlay)やスクリーン(Screen)で重ねる事もできます。

色を変える
#!/usr/local/bin/perl

## 色を変える

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名
$filename2 = "../img/perlmagick2.png";     #重ねる画像ファイル名

#ファイルを読み込む
my $image = Image::Magick->new;
$image->Read("$filename");
$image->Colorize(fill=>"#FF0000", opacity=>100);     #ここで色を変える

#重ねる画像を読み込む
my $image2 = Image::Magick->new;
$image2->Read("$filename2");
$image2->Colorize(fill=>"#0000FF", opacity=>100);     #ここで色を変える

#画像を重ねる(xとyの数値を変えることで位置を変更)
$image->Composite( image=>$image2, compose=>'over', x=>200, y=>80);

print ("Content-type: image/jpeg\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("jpeg:-");
print "\n\n";

undef $image;
undef $image2;
exit();

実行結果)

opacityを100にすると上記のように丸々塗りつぶされます。
透過pngは透過していない部分に色が付きます

$image->Colorize(fill=>"#FF0000", opacity=>50);     #ここで色を変える(opacityを変えると追加する色味の調整が可能)
$image2->Colorize(fill=>"#0000FF", opacity=>50);     #ここで色を変える(opacityを変えると追加する色味の調整が可能)

実行結果)

opacityを調整すると上記のような感じに

効果を付ける
#!/usr/local/bin/perl

## 効果を付ける(油絵調)

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名

#ファイルを読み込む
my $image = Image::Magick->new;
$image->Read("$filename");
$image->OilPaint();     #油絵調にする

print ("Content-type: image/jpeg\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("jpeg:-");
print "\n\n";

undef $image;
exit();

実行結果)

油絵調に変換。

$image->Blur(geometry=>80);     #ぼかし効果 0〜99.9の範囲で指定

実行結果)

全体的にぼかしてみたり

$image->Emboss(geometry=>10);     #エンボス効果

実行結果)

エンボス効果を入れてみたり

文字を書く
#!/usr/local/bin/perl

## 文字をのせる

use Image::Magick;

$filename = "../img/perlmagick1.jpg";     #読み込むファイル名

#ファイルを読み込む
my $image = Image::Magick->new;
$image->Read("$filename");
$text = "I Love Cat";     #書き込む文字列
$image->Annotate(
     text=>$text,
     x=>10,y=>170,     #文字列の位置
     fill=>"#FF0000",     #文字の色
     strokewidth=>2,     #文字の太さ(0〜3)
     antialias=>true,     #アンチエイリアス
     pointsize=>24,     #文字サイズ(px)
     font=>"APJapanesefont.ttf"     #フォントファイルまでのパス
);

print ("Content-type: image/jpeg\n\n");     #表示する画像ヘッダー
binmode STDOUT;
$image->Write("jpeg:-");
print "\n\n";

undef $image;
exit();

実行結果)

※フォントはあんずもじを使用しました。

上記のサンプルをまとめたzipファイルも一応用意してみました。必要な方はどうぞ。
(使用した写真やフォントファイルは入っていませんのでご注意を)
perlmagickサンプルzip

他にも色々面白いコマンドはあるので、ぜひ試してみてください。
Perl::ImageMagick – Linux Wizardへの道

公式サイト(英語)にもサンプル一覧があるので、そちらもぜひ参考に
実行結果 http://www.imagemagick.org/script/examples.php
スクリプト http://www.imagemagick.org/source/examples.pl

そのうちphpでも使えるようにもっと勉強したいですねぇ@・ェ・@

Category : MemoTags : ,

関連記事

1 Response

コメントを残す




About

中の人:Mei Koutsuki (@mei331)
神奈川でweb作ったり、お洋服つくったりしてる黒いひつじさん。ロリィタ系webクリエイター。12年9月に一児の母となり、自宅で子育てしながらお仕事してます。
>> もっと詳しく