PHP GD Edit Jpeg без повторного сжатия
Скажем, у меня есть файл 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?
1 ответ
Как вы сами сказали, JPEG - это формат с потерями. На самом деле он не хранит "пиксели" напрямую. Если вы вносите изменения в изображение, оно должно быть повторно сжато. Обойти это невозможно.
Причина, по которой ваш красный пиксель является "неправильным цветом" и "размытым", заключается в том, как работает сжатие JPEG. Опять же, он не хранит пиксели. Это делает акцент на изменения яркости, и фактическая информация о цвете не имеет большого значения.
Я не уверен, но вы можете повторно сжать только несколько блоков, на которые повлияло ваше изменение. Вы не сможете сделать это с помощью каких-либо стандартных функций, и вам придется самим разбираться в форматах и схемах сжатия.