我正在使用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'内容之间的差异?
答案 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
找不到更好的方法。