使用 php (jpeg) 优化上传的图像

在谷歌浏览器中运行页面速度时,它建议优化/压缩图像。这些图像主要由用户上传,因此我需要在上传过程中对其进行优化。我发现使用php优化jpeg图像类似于使用以下GD函数:

getimagesize()
imagecreatefromjpeg()
imagejpeg()

由于我在上传后调整图像大小,因此我已经通过这些功能拉动图像,此外,我还使用after来调整其大小。imagecopyresampled()imagecreatefromjpeg()

但是,页面速度仍然告诉我这些图像可以优化。如何在 php 脚本中完成此优化?在 imagejpeg() 中将质量设置得更低也不会有区别。


答案 1

imagejpeg 函数是您分配质量的位置。如果您已经将其设置为适当的值,那么您几乎无能为力。

页面速度可能认为所有超过一定大小的图像都是“需要压缩”的,也许只是确保它们都尽可能小(就高度/宽度而言)和压缩。

您可以在pagespeed文档上找到有关页面速度及其压缩建议的更多信息,http://code.google.com/speed/page-speed/docs/payload.html#CompressImages 它描述了一些适当压缩的技术/工具。

我也刚刚阅读了以下内容:

有几种工具可用于对JPEG和PNG文件执行进一步的无损压缩,而不会影响图像质量。对于 JPEG,我们建议使用 jpegtranjpegoptim(仅在 Linux 上可用;使用 --strip-all 选项运行)。对于 PNG,我们建议使用 OptiPNGPNGOUT

因此,也许(如果你真的想坚持谷歌的建议),你可以使用PHP在上传文件时对它们运行其中一个工具。exec


要使用php压缩,您需要执行以下操作(听起来您已经在这样做了):

图像在哪里,保存在哪里,是一个介于1和100之间的数字,用于选择要使用的jpeg压缩量。$source_url$destination_url$quality

function compressImage($source_url, $destination_url, $quality) {
    $info = getimagesize($source_url);

    if ($info['mime'] == 'image/jpeg') $image = imagecreatefromjpeg($source_url);
    elseif ($info['mime'] == 'image/gif') $image = imagecreatefromgif($source_url);
    elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source_url);

    //save file
    imagejpeg($image, $destination_url, $quality);

    //return destination file
    return $destination_url;
}

答案 2

修复功能:

function compressImage($source_url, $destination_url, $quality) {

    //$quality :: 0 - 100

    if( $destination_url == NULL || $destination_url == "" ) $destination_url = $source_url;

    $info = getimagesize($source_url);

    if ($info['mime'] == 'image/jpeg' || $info['mime'] == 'image/jpg')
    {
        $image = imagecreatefromjpeg($source_url);
        //save file
        //ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). The default is the default IJG quality value (about 75).
        imagejpeg($image, $destination_url, $quality);

        //Free up memory
        imagedestroy($image);
    }
    elseif ($info['mime'] == 'image/png')
    {
        $image = imagecreatefrompng($source_url);

        imageAlphaBlending($image, true);
        imageSaveAlpha($image, true);

        /* chang to png quality */
        $png_quality = 9 - round(($quality / 100 ) * 9 );
        imagePng($image, $destination_url, $png_quality);//Compression level: from 0 (no compression) to 9(full compression).
        //Free up memory
        imagedestroy($image);
    }else
        return FALSE;

    return $destination_url;

}

推荐