2010-09-09 107 views
2

我使用Perl和Image :: Magick模块来处理一些JPEG。Perl&Image :: Magick,按像素获取颜色值

我使用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 
     ]; 

该呼叫之前调整大小:(在该例子中)的指定像素的颜色为#b4b0af,返回值是0xB4B4,0xB0B0,0xAFAF。我不明白这是为什么,但我可以使用MOD 256处理它;

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

Image :: Magick只是超精确的(占短裤而不是字节)?
对于第二个Dumper输出和'verify.jpg'内容之间的差异,JPEG压缩账号是否存在?

回答

1

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

ImageMagick的可被编译以支持类型PixelPacket的32个或64位像素。这由QuantumDepth定义的值来控制。默认值是64位像素,它提供了最好的精度。

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

+0

谢谢布莱恩。非常有趣的链接。我想我会用更高的精度,但出于兴趣,我可以假设右移8位以上的值会给我一个准确的三字节表示的颜色? – aidan 2010-09-10 16:07:48

0

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