エフェクトの掛ける順番を変えてみる

ちょっと時間が空いちゃった。
今回は、エフェクトの掛ける順番を変えて、比べてみようと思う。

use v5.14;
use strict;
use warnings;
use Imager;

if ( (not @ARGV) or (not -e $ARGV[0]) ) {
    say "Usage:
    perl $0 file_path";
    exit( 0 );
}

my $img = Imager->new( file => $ARGV[0] )
    or die Imager->errstr();

my $levels = 8;
my $n = 20;
{
    my $img_src = $img->copy();

    $img_src->filter( type => 'postlevels', levels => $levels )
        or die $img_src->errstr;

    my $img_dst = hue_reduction( $img_src, $n );

    $img_dst->write( file => $0 . '-1.jpg', jpegquality => 90 );
}

{
    my $img_src = $img->copy();

    my $img_dst = hue_reduction( $img_src, $n );

    $img_dst->filter( type => 'postlevels', levels => $levels )
        or die $img_dst->errstr;

    $img_dst->write( file => $0 . '-2.jpg', jpegquality => 90 );
}

sub hue_reduction {
    my ( $img_src, $n ) = @_;

    my $img_dst = Imager::transform2( {
        constants => { n => $n },
        rpnexpr => 'x y getp1 !pix @pix hue n / int n * !hh @hh @pix sat @pix value hsv'
    }, $img_src );

    $img_dst or die $Imager::ERRSTR;
}

やってることは、Imagerで用意されているポスタリゼーションと、
自前で実装した色相間引きを順番に掛けている。

でも、掛ける順番を変えると、こんな感じで差が出る。
左が先にポスタリゼーション、右は後でポスタリゼーション。

20140821-1  20140821-2

ちなみに、元画像はこれ。

20140803-1

今回の例だと、一目瞭然!っていう風にはいかないけど、
それとなく差があるので、個人的に面白いと思ってる。

おしまい。

Leave a Comment