予想外に人気を博してしまった 昭和の写真ジェネレータ(仮) ですが、画像加工の方法を公開しておきます。
[追記] 以下のコードは説明用です。なお、実際に動いているコード(に限りなく近いもの) を CodeRepos に up しました。svnはこちらから
用意するもの。
- Perl
- Imagerモジュール
- 元ネタの画像
モジュールを load して、画像を Imager オブジェクトに読み込みます。
use Imager; use Imager::Fill; use List::Util qw/ min max /; my $img = Imager->new; $img->read( file => "source.jpg" );
コントラストを落とします。
$img->filter( type => "contrast", intensity => 0.7 );
少々ぼかします。(小さいと分かりにくいですが)
$img->filter( type => "conv", coef => [ 0, 1, 0.2 ] );
フチをつけます。
元画像よりもフチのサイズ分だけ大きい画像を #bbbbbb で塗りつぶして用意し、その上に元画像を paste です。色が #ffffff ではなく #bbbbbb なのは、この後のカラー処理の都合上。
この部分のコードは Imager に付いてくる border.pl を参照しました。
$img = solid_border( $img, "#bbbbbb" ); sub solid_border { my ( $source, $color ) = @_; my $w = $source->getwidth(); my $h = $source->getheight(); my $border = int ( max( $w * 0.015, $h * 0.015, 5 ) ); my $out = Imager->new( xsize => $source->getwidth() + 2 * $border, ysize => $source->getheight() + 2 * $border, bits => $source->bits, channels => $source->getchannels, ); $out->box( filled => 1, color => $color ); $out->paste( left => $border, top => $border, img => $source, ); return $out; }
#443322 で塗りつぶした画像を add (加算) します。
# 実際のコードでは、色の値に若干のランダム性を持たせています。
先の枠の色を #ffffff (真白) にしてしまうと、(#ffffff には何を足しても変わらないので) 枠に色がつきません。
my $fill = Imager::Fill->new( solid => '#443322', combine => 'add' ); $img->box( fill => $fill );
日付を加えます。
$img = add_date( $img, $date ); sub add_date { my ( $img, $date ) = @_; my $color = Imager::Color->new('#ffaa33'); my $ttfont = Imager::Font->new( file => '7barPBd.TTF', ); my $size = int( $img->getwidth * 0.04 ); $img->align_string( font => $ttfont, text => $date, x => int( $img->getwidth - $size * 1.5 ), y => int( $img->getheight - $size * 1.5 ), halign => 'right', valign => 'bottom', size => $size, color => $color, aa => 1, ); return $img; }
フォントは とろ庵 バイクと車用ステッカーのダウンロード さんの SEVENBAR bold を使用させていただきました。
ノイズを被せます。
$img->filter( type => 'noise', amount => 7 );
最後に JPEG で書き出して、完成です。
$img->write( file => "result.jpg", type => 'jpeg' );