PHP降低所有图像类型的质量

PHP降低所有图像类型的质量,php,image,compression,image-compression,Php,Image,Compression,Image Compression,我正在寻找一个可以降低所有图像类型质量(PNG、GIF和JPEG)的库。 我知道我可以使用imagejpeg() 我还知道,我可以使用imagepng()减少PNG,尽管这还不够强大 我需要的东西,可以转换PNG 24到PNG8不删除阿尔法 无法使用ImageMagick,因为我无法在服务器上安装任何内容 编辑: 我还需要一些可以从32位转换到8位的东西(我很确定这和32位的一样) 找到了解决方案 谢谢我知道您不想要GD库,但使用以下代码: $img = imagecreatefrompng($

我正在寻找一个可以降低所有图像类型质量(PNG、GIF和JPEG)的库。
我知道我可以使用
imagejpeg()

我还知道,我可以使用
imagepng()
减少PNG,尽管这还不够强大

我需要的东西,可以转换PNG 24到PNG8不删除阿尔法

无法使用ImageMagick,因为我无法在服务器上安装任何内容

编辑:
我还需要一些可以从32位转换到8位的东西(我很确定这和32位的一样)

找到了解决方案


谢谢

我知道您不想要GD库,但使用以下代码:

$img = imagecreatefrompng($src);
imagesavealpha($img, true);
imagepng($img, $dst, 9, PNG_ALL_FILTERS);
imagedestroy($img);
优化后的图片比原始大小小约40%,并且不会删除alpha


您希望优化的百分比是多少?

请尝试一下,这就是您希望的结果吗

<?php
$size = getimagesize("original.png");
$source = imagecreatefrompng("original.png");
$target = imagecreate($size[0], $size[1]);
imagecopy($target, $source, 0, 0, 0, 0, $size[0], $size[1]);
imagepng($target,"copy.png");  

根据我使用PHP的经验,我在图像处理方面总是遇到一些困难(使用GD,标准库)。
我相信没有任何PHP扩展是没有指示的。我建议您使用一些有助于工作的扩展,例如:

安装扩展后,请尝试以下操作:

# Load your image
$im = new Imagick('your-png32-image.png'); 
# Set quality/colors
$im->setImageFormat('PNG8');
$colors = min(255, $im->getImageColors());
$im->quantizeImage($colors, Imagick::COLORSPACE_RGB, 0, false, false);
# 8bits
$im->setImageDepth(8);
# Save image
$im->writeImage('your-png8-image.png');

要将任何PNG图像转换为8位PNG,请使用此函数,我刚刚创建了

function convertPNGto8bitPNG()

  function convertPNGto8bitPNG($sourcePath, $destPath) {
    $srcimage = imagecreatefrompng($sourcePath);
    list($width, $height) = getimagesize($sourcePath);
    $img = imagecreatetruecolor($width, $height);
    $bga = imagecolorallocatealpha($img, 0, 0, 0, 127);
    imagecolortransparent($img, $bga);
    imagefill($img, 0, 0, $bga);
    imagecopy($img, $srcimage, 0, 0, 0, 0, $width, $height);
    imagetruecolortopalette($img, false, 255);
    imagesavealpha($img, true);
    imagepng($img, $destPath);
    imagedestroy($img);
    }
参数

$sourcePath-源PNG文件的路径 $destPath-目标PNG文件的路径 用法


也许我遗漏了什么,但从PNG24到PNG8的转换会删除alpha数据。不,你完全正确。PNG8是不带Alpha的PNG。它只是RBG通道的组合,没有单独的RGB+阿尔法通道。人们在这里是非常错误的。我有很多带有alpha数据的PNG8图像(灰度图像)。@Ron,我知道你不是。看起来他们认为PNG总是需要一个完整的alpha通道(因此PNG X+8)来拥有alpha数据。这里有一个非常简单的例子,PNG8和alpha(我可以上传一个颜色版本,它是PNG8,并且包含alpha数据,如果出于任何原因,这看起来不可能的话):检查——他们做的几乎是相同的事情。您可以轻松创建一个脚本,将图像发送到他们的服务,然后将其取回。如果你感兴趣的话,我可以提供示例代码。这只是压缩图像并保存alpha,但与图像的原始位一起保存。将图像保存为png 8而不应用任何过滤器将使其大小至少减少65%(在photoshop中检查)。
convertPNGto8bitPNG('pfc.png', 'pfc8bit.png');