Optimice PNG al redimensionar con GD / PHP - ¿Cómo determinar la paleta de colores?

Tuve problemas para cambiar el tamaño de un archivo PNG y mantener archivos de tamaño pequeño.Solución encontrada aquí.

Al redimensionar el PNG, sin embargo, tuve problemas con la calidad de imagen. Por lo que pude ver, GD utiliza una paleta de colores de 8 bits indexada que distorsiona el texto y los colores se pierden, vea:

Imagen originalImagen redimensionada con solución dada arribaImagen redimensionada con un tweak²

²La idea para el pellizco que encontré aquí endesbordamiento de pila: Cree truecolor-image, cambie su tamaño y cópielo en una nueva imagen, de modo que la paleta se determine en función del resultado remuestreado y la calidad de la imagen sea mejor, como puede ver en elimagen de arriba.

// 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);

Problema: ninguno de los dos resultados es satisfactorio.

Estoy bastante seguro de que debe haber una manera de 1. determinar la paleta de colores y 2. mantener la mayoría de los colores de la imagen, de modo que 3. el PNG se vea similar al original y tenga un tamaño de archivo aceptable.

Ahora, solo veo ir por JPG en lugar de PNG. Pero si conoce una solución, le agradeceríamos que nos lo hiciera saber.

¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta