Image::Magickで画像の特定の部位の透明度を取得し、色を補正する。

苦労した。
日本語でも英語でもドキュメントを見つけられなかったが、おそらくあってるはず。

Image::Magickで特定部分の色情報取得

これはサンプルがゴロゴロ落ちてる。
こんな感じ

    my $image = Image::Magick->new;
    $image->Read('画像パスね');
    my ($r, $g, $b, $ugh) = split ',', $image->Get("pixel[10,10]");

ここまでは出来ていた。
$r $g $b がRGBに対応している。


が、画像内に透明部分があると、
黒と認識されてしまうことが判明・・。
favicon って透明処理しているのが多いから、こりゃ根本からの大問題。

$ughがあやしい・・・。

$ughがあやしい。

おそらくこれが透明を表すとにらんで、調べてみる。

ugh 意味 - Google Search

ugh
ugh /[N16-A139]h, [N16-A142]h, [N16-A142]g/ →発音
―【間】 [嫌悪(けんお)・軽蔑などを表わして] うふ!, うっ!, うえっ!

うぇうぇ、って。絶対にこれは違う意味だ・・・orz



もう少し探してみる。

ImageMagick: PerlMagick, Perl API for ImageMagick

英語を頑張って読んでも良く分からなかったが、なんとなくこれが透明度かな、っていう意味のない確信を持ち始める。

テストしてみる

透明度を3段階に指定した画像を作成して、読み込ませる。
こんな画像↓

結果
画像左部分

        'r' => 65535,
        'b' => 65535,
        'g' => 65535,
        'ugh' => 65535

画像中央

        'r' => 65535,
        'b' => 0,
        'g' => 0,
        'ugh' => 32639

画像右部分

        'r' => 65535,
        'b' => 0,
        'g' => 0,
        'ugh' => 16191

こんな感じ。
やはり透明度っぽい。


完璧な透明だと、白と認識される。
でも、それ以外だとRGB情報だけだとかなり見た目と乖離した結果になる。


例えば、透明度99%の赤の画像があったとする。
ほぼ透明。
人間の目でかろうじて超薄いピンクを認識できる程度だ。
これを、RGB情報だけを使って画像解析すると、真っ赤と認識されてしまう。


こりゃ補正しなければ

応急処置

とりあえずの処置

    my $image = Image::Magick->new;
    $image->Read('画像パスね');
    my ($r, $g, $b, $ugh) = split ',', $image->Get("pixel[10,10]");
    #透明度が設定されている場合、背景色が白の場合を想定して、見た目どおりに補正
    $r += $ugh if $ugh != 0;
    $r = 65535 if $r > 65535;
    $g += $ugh if $ugh != 0;
    $g = 65535 if $g > 65535;
    $b += $ugh if $ugh != 0;
    $b = 65535 if $b > 65535;

背景色が白、っての固定でやってるから、いまいちかな。
まぁ、とりあえず、っぽい挙動したので、今日はこれで満足して寝ることにする。
また明日見直して、おかしいところあれば直す