我希望在带有颜色名称或其十六进制代码的图像中获得唯一颜色的直方图。
我无法使用QueryColorname方法将直方图方法输出值转换为颜色名称或十六进制代码;它总是返回黑色并且不返回十六进制代码。
可能是由于(0 ... 65535)直方图()方法的结果范围,我无法将其转换为(0 ... 255),这是Querycolorname()方法的可接受范围。
#!/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黑色
答案 0 :(得分:0)
首先:当你在变量周围使用单引号时,它们不会被扩展。 QueryColorname
看到一个可能转换为零的字符串。这就是为什么所有颜色都是“黑色”的原因。
第二:我没有在文档中看到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";