在Google Chrome中运行Page Speed时,建议优化/压缩图像。这些图像大多是由用户上传的,因此我需要在上传过程中对其进行优化。我发现用PHP优化jpeg图像就像使用以下GD函数一样:
getimagesize()
imagecreatefromjpeg()
imagejpeg()
由于我在上传后调整图像大小,我已经通过这些功能提取图像,此外我在imagecopyresampled()
之后使用imagecreatefromjpeg()
来调整大小。
然而,Page Speed仍在告诉我这些图片可以进行优化。如何在php脚本中完成此优化?在imagejpeg()中设置较低的质量也没有区别。
答案 0 :(得分:16)
imagejpeg功能是指定质量的地方。如果您已经将其设置为适当的值,那么您几乎无能为力。
页面速度可能会将超过一定大小的所有图像视为“需要压缩”,或许只是确保它们都尽可能小(合理的高度/宽度)并进行压缩。
您可以在pagespeed docs http://code.google.com/speed/page-speed/docs/payload.html#CompressImages上找到有关页面速度和压缩建议的更多信息,其中介绍了一些适当压缩的技术/工具。
我刚刚阅读了以下内容:
有几种工具可以对JPEG和PNG文件进行进一步的无损压缩,而不会影响图像质量。对于JPEG,我们建议 jpegtran 或 jpegoptim (仅适用于Linux;使用--strip-all选项运行)。对于PNG,我们建议 OptiPNG 或 PNGOUT 。
所以也许(如果你真的想坚持谷歌的建议)你可以使用PHP的exec
在上传文件时运行其中一个工具。
要使用php进行压缩,请执行以下操作(听起来您已经这样做了):
$source_url
是图片的地方,$destination_url
是保存位置,$quality
是1到100之间的数字,用于选择要使用的jpeg压缩量。
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;
}
答案 1 :(得分:4)
修复功能:
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;
}
答案 2 :(得分:0)
你可以使用Imagick类。请考虑以下包装函数:
<?php
function resizeImage($imagePath, $width, $height, $blur, $filterType = Imagick::FILTER_LANCZOS, $bestFit = false)
{
//The blur factor where > 1 is blurry, < 1 is sharp.
$img= new \Imagick(realpath($imagePath));
$img->setCompression(Imagick::COMPRESSION_JPEG);
$img->setCompressionQuality(40);
$img->stripImage();
$img->resizeImage($width, $height, $filterType, $blur, $bestFit);
$img->writeImage();
}
?>
详细了解如何使用Imagick调整图像大小:
http://php.net/manual/en/class.imagick.php
http://php.net/manual/en/imagick.resizeimage.php
http://php.net/manual/en/imagick.constants.php#imagick.constants.filters
答案 3 :(得分:-1)
优化图像非常重要。有几个CMS平台有模块或插件来执行此过程。但是,如果您自己编程,则会在此页面上显示一个完整的php教程https://a1websitepro.com/optimize-images-with-php-in-a-directory-on-your-server/您将看到如何实现imagecreatefromjpeg($SrcImage);
和imagecreatefrompng($SrcImage);
以及imagecreatefromgif($SrcImage);
和页面上的视频说明。