Perl& Image :: Magick,按像素获取颜色值

时间:2010-09-09 23:56:43

标签: perl colors imagemagick getpixel

我正在使用Perl和Image :: Magick模块来处理一些JPEG。

我正在使用GetPixels子来获取每个像素的RGB分量。

e.g。

my @pixels = $img->GetPixels(
    width     => 1,
    height    => 1,
    x         => 0,
    y         => 0,
    map       => 'RGB',
    #normalize => 1
)

print Dumper \@pixels;

$img->Resize(
    width  => 1,
    height => 1,
    filter => 'Lanczos'
);

@pixels = $img->GetPixels(
    width     => 1,
    height    => 1,
    x         => 0,
    y         => 0,
    map       => 'RGB',
    #normalize => 1
);

print Dumper \@pixels;

$img->Write('verify.jpg');

我发现getPixels每个通道返回两个字节,例如

$VAR1 = [
          46260,
          45232,
          44975
        ];

$VAR1 = [
          58271,
          58949,
          60330
        ];

在调用Resize之前:(在本例中)指定像素的颜色为#b4b0af,返回值为0xB4B4,0xB0B0,0xAFAF。我不明白为什么会这样,但我可以使用MOD 256处理它;

但是在调用Resize之后,返回的值与我在输出文件中找到的实际值没有任何明显的对应关系(verify.jpg)。

Image :: Magick是否过于精确(占短裤而不是字节)? JPEG压缩是否考虑了第二个Dumper输出与'verify.jpg'内容之间的差异?

3 个答案:

答案 0 :(得分:1)

阅读关于colors in ImageMagick的所有内容,包括其量子深度:

  

可以编译ImageMagick以支持PixelPacket类型的32或64位像素。这由QuantumDepth定义的值控制。默认值为64位像素,可提供最佳精度。

您可能还想了解它是如何做的color reduction

答案 1 :(得分:0)

JPEG压缩是有损的,因此保存前的像素值与压缩图像中的像素之间没有直接对应关系。如果要了解压缩如何修改它,则必须加载新图像。

答案 2 :(得分:0)

花一些时间来解决相同的二进制(黑白)tiff问题:

    for my $y (0..$height-1) {
        my @pixels = $image->GetPixels(
            'width'   => 1,
            'height'  => 1,
            'x'       => 0,
            'y'       => $y,
            map       => 'RGB',
            normalize => 'True',
        );
        print  "$y: ",join(', ', @pixels),"\n";
    }

打印(缩短):

627: 1, 1, 1
628: 1, 1, 1
629: 0, 0, 0
630: 0, 0, 0
631: 0, 0, 0
632: 0, 0, 0
633: 1, 1, 1
634: 1, 1, 1

找不到更好的方法。