2

jpeg ファイルがあり、いくつかのピクセルを特定の色に設定したいとします。jpeg を保存すると、品質を 100 に設定しても色が失われ、新しいピクセルの周りにエイリアシングが見られます。数ピクセル。

// Create the GD resource
$img = imagecreatefromjpeg($filename);

// Set the first pixel to red
$color = imagecolorallocate($img, 255, 0, 0);
imagesetpixel($img, 0, 0, $color);

// Save the jpeg - is this where I'm wrong? I see the red pixel but it's the wrong color and is blurred.
imagejpeg($img, 'foo.jpg', 100);

// Lossless format works fine, red pixel is bright and accurate.
imagepng($img, 'foo.png');

GDはここに行く方法ではないのでしょうか?一部のピクセルの色を変更する必要があり、保存時に正確である必要があります。GIF、PNG、または JPEG2000 に依存せずにこれを行う方法はありますか?

4

1 に答える 1

4

あなたが言ったように、JPEGは非可逆フォーマットです。実際には「ピクセル」を直接保存しません。画像に変更を加えた場合、画像を再圧縮する必要があります。これを回避する方法はありません。

赤いピクセルが「間違った色」で「ぼやけている」理由は、JPEG 圧縮の仕組みによるものです。繰り返しますが、ピクセルは保存されません。明るさの変化を重視し、実際の色情報はあまり重要ではありません。

私は肯定的ではありませんが、変更によって影響を受けるいくつかのブロックのみを再圧縮できる場合があります。標準関数ではこれを行うことができず、形式と圧縮スキームを自分で掘り下げる必要があります。

于 2012-04-29T06:47:27.860 に答える