Imagerで階調を反転する

Imager::Transformationsmapっていう関数があったので、
何かに使えないかなーって思って試してみました。

サンプルのまんまですが、これで階調を反転させられます。

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 @table = reverse 0..255;
$img->map( all => \@table );

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

そのまま保存すると、あんまし画質が良くなかったので、
JPEGの画質を指定しました。

結果はこんな感じ。

20140803-1  20140804-1

でもって、色相を反転(?)、じゃなくて回転するのも、
いつものアレを使えば、こんな感じで書けます。

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_src = Imager->new( file => $ARGV[0] )
    or die Imager->errstr();

my $img_dst = Imager::transform2( {
    constants => {
        da => 180.0
    },
    rpnexpr => 'x y getp1 !pix @pix hue da + !hh @hh 360.0 lt @hh @hh 360.0 - if !hh @hh @pix sat @pix value hsv'
}, $img_src );

$img_dst or die $Imager::ERRSTR;

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

これはこれでイイ感じですね。

20140804-2

他にも、使い道がありそうですですが、
もしかしたら透過ありのPNGだと、落とし穴がありそうな気がするので、
それは宿題にしようと思います。

おしまい。

Leave a Comment