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