1

我从一个 jpg 设置像素。保存另一个 jpg 文件。再次读取一个新文件。获取像素。但它给了我不正确的结果。那是我的代码:

use Image::Magick;
use Data::Dumper;

my $im = new Image::Magick;
$im->Read('file1.jpg');
my @pixel = $im->GetPixel(x=>0,y=>0,channel=>'RGB', normalize=>'True');
print Dumper(@pixel);

my @color = ('1.0', '0.0', '0.0');
$im->SetPixel(x=>0, y=>0, channel=>'RGB', normalize=>'True', color => \@color);
$im->Write('file30.jpg');

@pixel = $im->GetPixel(x=>0,y=>0,channel=>'RGB', normalize=>'True');
print Dumper(@pixel);

print "-" x 30, "\n";
my $nim = new Image::Magick;
$nim->Read('file30.jpg');

my @npixel = $nim->GetPixel(x=>0,y=>0,channel=>'RGB', normalize=>'True');
print Dumper(@npixel);

当我运行它时:

$VAR1 = '0.133333333333333';
$VAR2 = '0.141176470588235';
$VAR3 = '0.0588235294117647';
$VAR1 = '1';
$VAR2 = '0';
$VAR3 = '0';
------------------------------
$VAR1 = '0.32156862745098';
$VAR2 = '0.247058823529412';
$VAR3 = '0.188235294117647';

为什么@npixel 给了我错误的结果?如何修复?

UPD

它适用于 .BMP 文件。

4

1 回答 1

4

发布与我上面的评论相对应的答案。

这最好通过有损与无损压缩的比较来解释:

https://en.wikipedia.org/wiki/Lossy_compression

简而言之,您可以使用 imagemagick 处理 RGB 像素数组、设置像素值、获取它们等。

保存时,还有一些其他操作不受您的控制。对于 JPEG,它是一种称为 DCT(离散余弦变换)的有损压缩算法:http ://en.wikipedia.org/wiki/Discrete_cosine_transform 。为了减小文件大小,这种有损压缩(在 JPEG 的情况下)是必要的。

如果您不想遇到此问题,则需要使用:

  1. 未压缩的数据(即:RAW/BMP 文件)。保存文件时,它会按原样写入输出文件。不应用压缩或失真。http://en.wikipedia.org/wiki/BMP_file_format
  2. 使用无损压缩。这通常会压缩数据以减小文件大小,但不会像有损压缩那样缩小文件大小。PNG 就是一个例子,ImageMagick 支持它。您的数据不会按原样写入输出文件,但会在保存和打开时进行转换,因此您可以准确地获取每个像素的所有原始数据。 http://en.wikipedia.org/wiki/Portable_Network_Graphics
于 2013-05-23T22:15:17.903 回答