Оптимизировать PNG при изменении размера с помощью GD / PHP - Как определить цветовую палитру?

У меня были проблемы с изменением размера PNG и сохранением небольших размеров файлов. Решение найдено здесь.

Однако при изменении размера PNG у меня возникли проблемы с качеством изображения. Насколько я мог видеть, GD использует индексированную 8-битную цветовую палитру, которая искажает текст и теряет цвета, см.:

²Идея настройки, которую я нашел здесь, в stackoverflow: создать изображение truecolor, изменить его размер и скопировать в новое изображение. , поэтому палитра определяется на основе результата повторной выборки, а качество изображения лучше, как вы можете видеть на изображении выше < / а>.

// create new image
$newImageTmp = imagecreatetruecolor($newwidth,$newheight);
// we create a temporary truecolor image
// do the image resizing by copying from the original into $newImageTmp image
imagecopyresampled($newImageTmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);
// create output image
$newImage = imagecreate($newwidth,$newheight);
// copy resized truecolor image onto index-color image
imagecopy($newImage,$newImageTmp,0,0,0,0,$newwidth,$newheight);
// write image to buffer and save in variable
ob_start(); // stdout --> buffer
imagepng($newImage,NULL,6);
$newImageToSave = ob_get_contents(); // store stdout in $newImageToSave
ob_end_clean(); // clear buffer
// remove images from php buffer
imagedestroy($src);
imagedestroy($newImageTmp);
imagedestroy($newImage);

Проблема: оба результата не являются удовлетворительными.

Я совершенно уверен, что должен быть способ 1. определить цветовую палитру и 2. сохранить большинство цветов изображения, чтобы 3. PNG выглядел так же, как оригинал, и имел приемлемый размер файла.

Теперь я вижу только JPG вместо PNG. Но если вы знаете решение, мы будем очень признательны, если вы сообщите мне / нам.

Спасибо!


person Avatar    schedule 30.11.2012    source источник


Ответы (2)


Все, что вам нужно, это заменить

 $newImage = imagecreate($newwidth,$newheight);

С участием

 $newImage = imagecreatetruecolor($newwidth, $newheight);

Выход $maxImgWidth = 200;

введите описание изображения здесь

person Baba    schedule 30.11.2012
comment
Я попробовал это вчера, когда столкнулся с проблемой. Но затем снова возникает основная проблема: большой размер файла. Для примера изображения, размер которого изначально составляет 47 КБ, я получаю 136 КБ. Так что это не выход. - person Avatar; 30.11.2012
comment
Вы должны задавать вопросы, а не говорить So this is not a solution можете ли вы сохранить файл выше ??? Его 18.5KB без изменения размера его 46KB на 1 КБ меньше, чем оригинал .... Поскольку вы пришли к выводу, я лучше не буду отвечать снова .. Удачного дня - person Baba; 30.11.2012
comment
Извините за формулировку, английский не мой родной язык. Простите за это. Да, вы правы, изменение размера изображения до ширины 200 пикселей дает небольшой размер файла ... Я забыл упомянуть в вопросе, что я изменяю размер изображения до ширины 515px. + Еще раз спасибо за решения, которые вы дали! - person Avatar; 30.11.2012
comment
Хорошо, я решил использовать imagecreatetruecolor, но затем использовать imagejpeg($newImage,NULL,90); вместо imagepng($newImage,NULL,6);, что дает мне (по крайней мере, для примера изображения) аналогичное качество и аналогичный размер файла. - person Avatar; 30.11.2012

Форк PHP GD не имеет удобной генерации палитры, поэтому вы можете получить PNG32 только со сжатием vanialla libpng.

Для маленьких PNG8 с палитрой используйте pngquant, например http://pngquant.org/php.html

А затем сожмите его с помощью advpng или zopfli-png.

person Kornel    schedule 20.10.2014