我有一个4x1像素的png,其中最左边的像素是白色(#ffffff),第二个像素是红色(#ff0000),第三个像素是绿色(#00ff00),最右边的像素是蓝色(#0000ff ),在这里几乎不可见:。
使用以下perl脚本,我尝试读取每个像素的rgb值:
use warnings;
use strict;
use GD;
my $image = new GD::Image('white-red-green-blue.png') or die;
for (my $x=0; $x<4; $x++) {
my $index = $image->getPixel($x, 0);
my ($r,$g,$b) = $image->rgb($index);
printf "%3d %3d %3d\n", $r, $g, $b;
}
令我惊讶的是,它打印了
252 254 252
252 2 4
4 254 4
4 2 252
而我预计
255 255 255
255 0 0
0 255 0
0 0 255
为什么脚本会报告错误的rgb值,如何教它报告正确的值?
修改根据 mpapec 的提问,base64 white-red-green-blue.png
的输出是
iVBORw0KGgoAAAANSUhEUgAAAAQAAAABCAIAAAB2XpiaAAAAAXNSR0IArs4c6QAAAARnQU1B
AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY/gPBAwMDEDM8B8AL90F
+8V5iZQAAAAASUVORK5CYII=
编辑II 根据 dgw 的建议,我也尝试my $image = newFromPng GD::Image('white-red-green-blue.png') or die;
但结果相同。
更新:我使用Image::Magick
代替GD
尝试了同样的事情:
use warnings;
use strict;
use Image::Magick;
my $image = Image::Magick->new or die;
my $read = $image -> Read('white-red-green-blue.png');
for (my $x=0; $x<4; $x++) {
my @pixels = $image->GetPixels(
width => 1,
height => 1,
x => $x,
y => 0,
map =>'RGB',
#normalize => 1
);
printf "%3d %3d %3d\n", $pixels[0] / 256, $pixels[1] / 256, $pixels[2] / 256;
}
并且有点不可思议地打印出预期的
255 255 255
255 0 0
0 255 0
0 0 255
答案 0 :(得分:3)
<强>更新强>
好的,如果您执行此操作,它可以正常使用您的图像:
GD::Image->trueColor(1);
在开始使用GD之前。我认为这是因为一张图片是调色板而另一张不是。见这里:
原始答案
它在我的iMac上工作正常。我用ImageMagick生成了这样的图像:
convert -size 1x1! xc:rgb\(255,255,255\) xc:rgb\(255,0,0\) xc:rgb\(0,255,0\) xc:rgb\(0,0,255\) +append wrgb.png
./go.pl
255 255 255
255 0 0
0 255 0
0 0 255
我怀疑你的图像没有正确生成。
答案 1 :(得分:1)
您的源图像并非您所期望的纯RGB,但如果您愿意,可以生成一个,
use warnings;
use strict;
use GD;
my $image = new GD::Image('white-red-green-blue.png') or die;
my @c = (
[255,255,255],
[255,0,0],
[0,255,0],
[0,0,255],
);
for my $x (0 .. 3) {
##
$image->setPixel(
$x,0, $image->colorAllocate(@{ $c[$x] })
);
##
my $index = $image->getPixel($x, 0);
my ($r,$g,$b) = $image->rgb($index);
printf "%3d %3d %3d\n", $r, $g, $b;
}
输出
255 255 255
255 0 0
0 255 0
0 0 255
echo 'iVBORw0KGgoAAAANSUhEUgAAAAQAAAABBAMAAAALEhL+AAAAGFBMVEUEAvwE/gT8AgT8/vz/////
AAAA/wAAAP/i4quSAAAAC0lEQVQImWNwTQcAAPQArQCZcI0AAAAASUVORK5CYII=' |
base64 -d > new.png