Image::Imlib2でアイコンをクリスマス仕様にB!

ハッピーメリークリスマス!aomushi510です。好きなお寿司のネタはサーモンです!

今日はクリスマスイブということで、Image::Imlib2を使って簡単にアイコンをクリスマス仕様にしちゃいましょう!

Perlで画像加工をするときに使うモジュールは、Image::Imlib2の他にもImage::MagickやImager、GD::Imageなどがあります。

yusukebeさんのエントリでは、Image::Imlib2が超絶速いそうです。Image::Imlib2すごい!ってことで早速はじめましょう。

はじめに

まずはImage::Imlib2をインストールしましょう。

インストールをする前に、Cのライブラリと使いたい画像形式のライブラリを入れておきましょう。

今回はjpegとpngを使いたいと思います。

$ port install libpng
$ port install imlib2

ではImage::Imlib2をインストールします。簡単ですね!

cpan> install Image::Imlib2

画像の読み込み、書き出し

インストールできたら、画像を読み込んだり書き出したりしてみましょう。

face.jpgを読み込んで、face2.jpgに書き出してみます。

#!/usr/bin/perl

use strict;
use warnings;
use Image::Imlib2;

my $dir = '/path/to/image';

my $image = Image::Imlib2->load("$dir/face.jpg");
$image->save("$dir/face2.jpg");

できた画像

http://azu.sh/jperl_advent_calendar_2009/image/face2.jpg

画像の合成

これであなたもImage::Imlib2を使うことができました!が、肝心のアイコンがさみしいです><

クリスマスということで、サンタ帽をかぶってみましょう。

http://azu.sh/jperl_advent_calendar_2009/image/santa_hat.png

このようなサンタ帽画像を用意します。それでは合成してみましょう。

#!/usr/bin/perl

use strict;
use warnings;
use Image::Imlib2;

my $dir = '/path/to/image';

my $image = Image::Imlib2->load("$dir/face.jpg");
$image->set_quality(100);
my $santa_hat = Image::Imlib2->load("$dir/santa_hat.png");
$image->blend($santa_hat, 1, 0, 0, 300, 300, 0, 0, 300, 300);

$image->save("$dir/with_santa_hat.png");

できた画像

http://azu.sh/jperl_advent_calendar_2009/image/with_santa_hat.png

サンタ帽をかぶることができました!簡単ですね!

画像を作成する

サンタ帽をかぶってクリスマスっぽくなりました。もうひといき、今度は星画像を作ってみましょう。

Image::Imlib2::Polygonというモジュールを使って多角形を作ります。

星形は正五角形の頂点を結ぶので、先にShape::RegularPolygonを利用して正五角形の頂点を取得しておきます。

そのあと1つ飛びに頂点を描き、まさに手書きで星を書くときのように描いていきます。

これだけでは中の正五角形が塗られないので、中身も後から塗って星形の完成です。

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Image::Imlib2;
use Shape::RegularPolygon;

my $dir = '/path/to/image';

my $image = Image::Imlib2->new_transparent(100, 100);
$image->set_colour(255, 255, 0, 255);

my $points = &get_points(50);
my $poly = Image::Imlib2::Polygon->new();

for my $point (@$points) {
    $poly->add_point($point->{x}, $point->{y});
}
$poly->fill();

$image->draw_polygon($poly, 1); 
$image->fill(50,50);
$image->save("$dir/star.png");


sub get_points {
    my $center = shift;

    my $polygon = new Shape::RegularPolygon;
    $polygon->center($center, $center);
    $polygon->sides(5);
    $polygon->radius(50);
    my @points = $polygon->points;

    return [$points[0], $points[2], $points[4], $points[1], $points[3], $points[0]];
}

できた画像

http://azu.sh/jperl_advent_calendar_2009/image/star.png

できた画像を合成します。

create_rotate_imageで画像を回転させて貼り付けます。

#!/usr/bin/perl

use strict;
use warnings;
use Image::Imlib2;

my $dir = '/path/to/image';

my $image = Image::Imlib2->load("$dir/with_santa_hat.png");
$image->set_quality(100);
my $star = Image::Imlib2->load("$dir/star.png");
$image->blend($star, 1, 0, 0, 100, 100, 0, 200, 100, 100);

my $rotated = $star->create_rotated_image(30 / 360 * 3.141519*2);
$image->blend($rotated, 1, 0, 0, 150, 150, 210, 80, 100, 100);

$image->save("$dir/with_star.png");

できた画像

http://azu.sh/jperl_advent_calendar_2009/image/with_star.png

できました!これでアイコンがにぎやかになりましたね!

まとめ

Image::Imlib2を使うと簡単に画像を加工することができます。ちょっとした画像編集にPerlを使ってみるのはいかがですか?

明日はAdvent Calendarの大トリ、piarraさんです。楽しみですね!