Imagerで階調を反転する
Imager::Transformationsにmapっていう関数があったので、
何かに使えないかなーって思って試してみました。
サンプルのまんまですが、これで階調を反転させられます。
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の画質を指定しました。
結果はこんな感じ。
でもって、色相を反転(?)、じゃなくて回転するのも、
いつものアレを使えば、こんな感じで書けます。
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 );
これはこれでイイ感じですね。
他にも、使い道がありそうですですが、
もしかしたら透過ありのPNGだと、落とし穴がありそうな気がするので、
それは宿題にしようと思います。
おしまい。



Leave a Comment