使用GD / PHP调整大小时优化PNG - 如何确定调色板?

时间:2012-11-30 09:09:25

标签: php image resize png

我在调整PNG大小和维护小文件时遇到了麻烦。 Solution found here

然而,在调整PNG大小时,我遇到了有关图像质量的问题。据我所见,GD使用索引的8位颜色调色板,扭曲文本和颜色迷失,请参阅:

²我在stackoverflow找到的调整的想法:创建真彩色图像,调整大小并将其复制到新图像,因此调色板是根据重采样结果确定的,图像质量更好正如您在image above中所看到的那样。

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

问题:两种结果都不令人满意。

我很确定必须有一种方法来确定调色板,并且2.保持图像的大部分颜色,以便3. PNG看起来与原始颜色相似并且文件大小可以接受。< / p>

现在,我只看到JPG而不是PNG。但是如果你知道一个解决方案,如果你让我/我们知道,我们将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

您只需要替换

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

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

输出$maxImgWidth = 200;

enter image description here

答案 1 :(得分:0)

PHP的GD分支没有可用的调色板生成,所以你只能获得带有vanialla libpng压缩的PNG32。

对于带调色板的小型PNG8使用pngquant,例如http://pngquant.org/php.html

然后使用advpng或zopfli-png进一步压缩它。