2

我正在使用 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”内容之间的差异?

4

3 回答 3

1

阅读ImageMagick 中有关颜色的所有内容,包括其量子深度:

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

您可能还想了解它是如何减少颜色的。

于 2010-09-10T07:09:34.717 回答
0

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

于 2010-09-10T02:34:19.050 回答
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

没有找到更好的办法。

于 2020-07-29T14:05:49.900 回答