Hatena::ブログ(Diary)

酒日記 はてな支店 RSSフィード

2007-09-24

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

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

[追記] 以下のコードは説明用です。なお、実際に動いているコード(に限りなく近いもの) を CodeRepos に up しました。svnはこちらから

用意するもの。

モジュールを 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' );

kohnewagekohnewage 2007/09/25 03:12 こんばんは、面白いので遣わしてもらいますね。
ソースを公開されてますが改良OKって事でしょうか?
もしOKのようでしたら改良?(改造?)してみたいなと思ってます。

sfujiwarasfujiwara 2007/09/25 20:53 改造はどうぞご自由に。
http://coderepos.org/share/browser/websites/showa_photo_generator/
実際動いているものをこちらに up しました。

kohnewagekohnewage 2007/09/26 00:12 おお。ほんとですか???めちゃくちゃうれしいですわ。実際に改良が出来ましたら
報告させてもらいます。後、もしよろしかったら私のサイトにも転載させてもらえませんか?
きちんと著作権表示はさせてもらいます。(当たり前ですが^^;)

sfujiwarasfujiwara 2007/09/26 00:52 CodeReposのほうに License 表記足しておきましたので、(転載も含めて) ご自由にご利用くださいませ。楽しみに待ってます(^^

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/sfujiwara/20070924/1190645783