昭和の写真ジェネレータの作り方

予想外に人気を博してしまった 昭和の写真ジェネレータ(仮) ですが、画像加工の方法を公開しておきます。

[追記] 以下のコードは説明用です。なお、実際に動いているコード(に限りなく近いもの) を 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' );