GoogleでPage Speedを実行する場合Chrome画像を最適化/圧縮することをお勧めします。これらの画像は主にユーザーによってアップロードされるため、アップロード時に最適化する必要があります。jpeg画像の最適化についてphpは、次のGd関数を使用するようなものです。
_getimagesize()
imagecreatefromjpeg()
imagejpeg()
_
アップロード後に画像のサイズを変更しているので、これらの関数を使用して画像をすでに取得しています。さらに、imagecopyresampled()
の後にimagecreatefromjpeg()
を使用して画像のサイズを変更しています。
しかし、それでもPage Speedはこれらの画像を最適化できると私に伝えています。 PHPスクリプトでこの最適化を行うにはどうすればよいですか? imagejpeg()で品質を低く設定しても違いはありません。
Imagejpeg関数は、品質を割り当てる場所です。すでに適切な値に設定している場合は、他にできることはほとんどありません。
ページ速度はおそらく、特定のサイズを超えるすべての画像を「圧縮が必要」であると見なします。おそらく、それらがすべて適切な大きさ(高さ/幅の点で)小さく、圧縮されていることを確認してください。
ページスピードの詳細と圧縮の提案については、pagespeedのドキュメント http://code.google.com/speed/page-speed/docs/payload.html#CompressImages をご覧ください。適切に圧縮するためのテクニック/ツール。
私はまた、以下を読みました:
画質に影響を与えずに、JPEGおよびPNGファイルでlossless圧縮をさらに実行するいくつかのツールが利用可能です。 JPEGの場合、jpegtranまたはjpegoptim(Linuxでのみ使用可能)をお勧めします。 --strip-allオプションで実行します)。 PNGの場合、OptiPNGまたは)[〜#〜] pngout [〜#〜]。
したがって、おそらく(本当にGoogleの提案に固執したい場合は)、PHPのexec
を使用して、アップロードされたファイルに対してこれらのツールの1つを実行できます。
Phpで圧縮するには、次のようにします(すでにこれを行っているようです)。
どこ $source_url
は画像、$destination_url
は保存先であり、$quality
は、使用するJPEG圧縮の量を選択する1〜100の数値です。
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;
}
修復された機能:
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;
}
これには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.phphttp://php.net/manual/en/imagick.constants.php #imagick.constants.filters