1. 使用GD库进行PNG压缩

<?php
function compressPNG($source, $destination, $quality = 9) {
    list($width, $height) = getimagesize($source);
    $image = imagecreatefrompng($source);

    // 调整压缩质量
    ob_start();
    imagepng($image, null, $quality);
    $png_compressed = ob_get_contents();
    ob_end_clean();

    // 写入压缩后的图片
    imagepng($image, $destination);
}
?>

在这个例子中,compressPNG函数接受源文件路径、目标文件路径和可选的压缩质量参数。压缩质量范围从0(无压缩)到9(最大压缩)。使用imagepng函数时,第二个参数为null表示不指定压缩级别,而第三个参数指定了压缩质量。

2. 利用PHP的ImageMagick扩展

<?php
function compressPNGWithImageMagick($source, $destination, $quality = 9) {
    $cmd = escapeshellcmd("convert -quality {$quality} {$source} {$destination}");
    system($cmd);
}
?>

3. 使用在线服务

<?php
function compressPNGOnline($source, $destination, $quality = 9) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "https://api.compressorjs.com/compress");
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, [
        'file' => new CURLFile($source),
        'quality' => $quality
    ]);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);

    file_put_contents($destination, $response);
}
?>

在这个例子中,compressPNGOnline函数使用CURL库向在线服务发送请求,上传文件并接收压缩后的数据。

4. 优化颜色和透明度

<?php
function removeTransparencyFromPNG($source, $destination) {
    $image = imagecreatefrompng($source);
    $width = imagesx($image);
    $height = imagesy($image);

    $color = imagecolorallocatealpha($image, 0, 0, 0, 127);
    imagefill($image, 0, 0, $color);
    imagecolortransparent($image, $color);

    imagepng($image, $destination);
    imagedestroy($image);
}
?>

总结