【问题标题】:Perl & Image::Magick, getting color values by pixelPerl & Image::Magick,按像素获取颜色值
【发布时间】:2020-07-29 22:05:49
【问题描述】:

我正在使用 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、0xAFAF。我不明白这是为什么,但我可以使用 MOD 256 处理它;

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

Image::Magick 是否只是超精确(考虑短裤而不是字节)?
JPEG 压缩是否解释了第二个 Dumper 输出与“verify.jpg”内容之间的差异?

【问题讨论】:

    标签: perl colors imagemagick getpixel


    【解决方案1】:

    阅读有关colors in ImageMagick 的所有信息,包括它的量子深度:

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

    您可能还想了解color reduction 的作用。

    【讨论】:

    • 谢谢布赖恩。也非常有趣的链接。我想我会使用更高的精度,但出于兴趣,我可以假设将上面的值右移 8 位会给我一个准确的三字节颜色表示吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我花了一些时间为二进制(黑白)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
      

      没有更好的办法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多