我正在尝试使用Image :: Magick创建新图像,并将背景颜色设置为从上一步检索到的RGB值。然而,所有写出来的都是黑色图像。我知道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 . ")")
答案 0 :(得分: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");
这假设您正在使用q深度为16位的ImageMagick。如果只有8位,那么这个:
$rgbhex[$i] = sprintf("%X", $rgbdec[$i]/256);
成为这个:
$rgbhex[$i] = sprintf("%X", $rgbdec[$i]);
虽然我相信在@rgbdec中使用十进制值有一种更简单的方法,但也许有人会发布它。