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 がチャネルごとに 2 バイトを返すことがわかりました。

$VAR1 = [
          46260,
          45232,
          44975
        ];

$VAR1 = [
          58271,
          58949,
          60330
        ];

Resize の呼び出し前: (この例では) 指定されたピクセルの色は #b4b0af であり、返される値は 0xB4B4、0xB0B0、0xAFAF です。これがなぜなのかわかりませんが、MOD 256 を使用して対処できます。

しかし、Resize を呼び出した後、返された値は、出力ファイル (verify.jpg) で見つけた実際の値と明確に対応していません。

Image::Magick は超精密なだけですか (バイトではなくショートを考慮)?
また、JPEG 圧縮は、2 番目の 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 に答える