1

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 に答える