2011-08-10 55 views
3

我正在尝试使用Image :: Magick创建一个新图像,并将背景颜色设置为从上一步检索到的RGB值。但是,所有正在写出的内容都是黑色的图像。我知道RGB值是正确的,因为我验证了这些值。以下是我尝试过的一个例子。Perl - Image :: Magick RGB背景的新图像

# Read RGB value at pixel 2,11 in another image 
my $swatchImg = new Image::Magick;  
$swatchImg->Read($swatchPath) 
my @rgb = $swatchImg->GetPixel(x=>2,y=>11); 
undef $swatchImg; 

# Create a new image, with the background set to the rgb value retrieved above 
my $img = Image::Magick->new; 
$img->Set(size=>"50x50"); 
$img->Set(background=>\@rgb); 
$img->ReadImage(); 

我也试过:

$img->Colorize(fill=>\@rgb, opacity=>1); 

任何想法?


编辑:

这个工作。不知道是否有任何清洁方法:

ReadImage("xc:rgb(" . $rgb[0]*100 . "," . $rgb[1]*100 . "," . $rgb[2]*100 . ")") 

回答

3

你可以做这样的事情:

my $rgbdec = $swatchImg->Get("pixel[2,11]"); 
my @rgbdec = split (/,/, $rgbdec); 
my @rgbhex; 
## Convert decimal @rgbdec (0..65536) to hex @rgbhex (00..FF) 
for (my $i=0; $i<=3; $i++) { 
    $rgbhex[$i] = sprintf("%X", $rgbdec[$i]/256); 
    if ($rgbhex[$i] eq "0") { $rgbhex[$i] = "00"; } 
} 
my $hexcolor = $rgbhex[0].$rgbhex[1].$rgbhex[2]; 

my $img = Image::Magick->new(size=>"50x50); 
$img->Read("xc:#$hexcolor"); 

这里假设你正在使用ImageMagick与16位Q-深度。如果只有8位,那么这个:

$rgbhex[$i] = sprintf("%X", $rgbdec[$i]/256); 

变成这样:

$rgbhex[$i] = sprintf("%X", $rgbdec[$i]); 

虽然我相信这是一个简单的只使用在@rgbdec十进制值的方式,也许有人会发表。

+0

我是否使用十六进制代码或RGB值似乎并不重要。任何一个都会导致黑色图像。 – Steve

+0

你能打印@rgbdec中的项目的值以及$ hexcolor吗? –

+0

您的第二次修订工作!尽管直接使用RGB值会很好。 – Steve