2

色の名前またはその 16 進コードを使用して、画像内の一意の色のヒストグラムを取得したいと考えています。

QueryColorname メソッドを使用して、ヒストグラム メソッドの出力値を色名または 16 進コードに変換できません。常に黒を返し、16 進コードは返しません。

Querycolorname() メソッドの許容範囲である (0 .. 255) に変換できない、histogram() メソッドからの (0 ... 65535) 結果範囲が原因である可能性があります。

#!/usr/bin/perl
use Image::Magick;

$image=Image::Magick->new();
$image->ReadImage('Sun.jpeg'); 

my @histogram = $image->Histogram();
print "Red\tGreen\tBlue\tOpacity\tCount\tName\n";
for(my $i=0; $i<=29; $i++){ #Get 5 unique colors
   print "$histogram[$i]\t";
   if (($i+1)%5 == 0){ #Array elements of unique color
      my $name = $image->QueryColorname('rgb16($histogram[$i-4],$histogram[$i-3],$histogram[$i-    2],$histogram[$i-1])');
      print "$name\n";
   }
}

結果は次のようになります。

赤 緑 青 不透明度 カウント 名前
0 0 0 0 16134 黒
257 257 257 0 27 黒
0 257 0 0 303 黒
257 0 0 0 286 黒
257 257 0 0 8 黒
71 0 0 0 82 黒

http://www.imagemagick.org/script/perl-magick.phpのメソッドの説明

4

1 に答える 1

0

まず第一に、変数を一重引用符で囲んでいるため、展開されません。QueryColornameゼロに変換される可能性のある文字列を認識します。そのため、すべての色が「黒」です。

2番目:ドキュメントに表示rgb16されません。あなたが望むことをしていないと思います。代わりに、8 ビットにスケールダウンする必要があります。

両方をまとめると、内側の if-Block に次のようなものを提案します。

my $colVec = "rgb(";
$colVec .= int($histogram[$i-4]/65535*256) . ",";
$colVec .= int($histogram[$i-3]/65535*256) . ",";
$colVec .= int($histogram[$i-2]/65535*256) . ",";
$colVec .= $histogram[$i-1] . ")";
print $image->QueryColorname($colVec) . "\n";
于 2015-03-21T14:26:54.130 に答える