代码之家  ›  专栏  ›  技术社区  ›  aidan

perl&image::magick,按像素获取颜色值

  •  2
  • aidan  · 技术社区  · 14 年前

    我正在使用Perl和image::magick模块来处理一些jpeg。

    我使用getpixels子元素来获取每个像素的RGB组件。

    例如

    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、0xafafaff。我不明白这是为什么,但我可以用256型来处理它;

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

    image::magick是否只是超精确的(考虑的是短裤而不是字节)?
    jpeg压缩是否解释了第二个转储程序输出和“verify.jpg”内容之间的差异?

    2 回复  |  直到 14 年前
        1
  •  1
  •   brian d foy    14 年前

    阅读所有关于 colors in ImageMagick 包括量子深度:

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

    你可能还想看看它是怎么做到的 color reduction .

        2
  •  0
  •   cjm    14 年前

    jpeg压缩是有损的,因此保存前的像素值与压缩图像中的像素之间没有直接对应关系。如果想知道压缩是如何修改新图像的,就必须加载新图像。