如何为GD的像素获取正确的rgb值?

时间:2014-10-27 11:49:40

标签: perl gd rgb pixel

我有一个4x1像素的png,其中最左边的像素是白色(#ffffff),第二个像素是红色(#ff0000),第三个像素是绿色(#00ff00),最右边的像素是蓝色(#0000ff ),在这里几乎不可见:enter image description here

使用以下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

2 个答案:

答案 0 :(得分:3)

<强>更新

好的,如果您执行此操作,它可以正常使用您的图像:

GD::Image->trueColor(1);

在开始使用GD之前。我认为这是因为一张图片是调色板而另一张不是。见这里:

enter image description here

原始答案

它在我的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