Lors de l'exécution de Page Speed dans Google Chrome, il est suggéré d'optimiser/de compresser les images. Ces images sont principalement téléchargées par les utilisateurs, il faudrait donc les optimiser lors du téléchargement. Ce que je trouve sur l’optimisation d’images JPEG avec PHP est un peu comme l’utilisation des fonctions Gd suivantes:
getimagesize()
imagecreatefromjpeg()
imagejpeg()
Comme je redimensionne les images après le téléchargement, je tire déjà l’image à travers ces fonctions et j’utilise en outre imagecopyresampled()
après imagecreatefromjpeg()
pour la redimensionner.
Mais alors, Page Speed me dit toujours que ces images peuvent être optimisées. Comment puis-je accomplir cette optimisation dans un script php? Régler la qualité plus bas dans imagejpeg () ne fait aucune différence non plus.
La fonction imagejpeg est l'endroit où vous attribuez la qualité. Si vous définissez déjà cette valeur sur une valeur appropriée, vous ne pouvez rien faire de plus.
La vitesse de la page considère probablement toutes les images dépassant une certaine taille comme "nécessitant une compression". Assurez-vous simplement qu'elles sont toutes aussi petites que raisonnables (en termes de hauteur/largeur) et compressées.
Pour en savoir plus sur la vitesse des pages et ses suggestions de compression, consultez pagespeed docs http://code.google.com/speed/page-speed/docs/payload.html#CompressImages , qui décrit certaines techniques/outils. compresser de manière appropriée.
Je viens aussi de lire ce qui suit:
Plusieurs outils sont disponibles pour effectuer davantage, lossless compression sur les fichiers JPEG et PNG, sans effet sur la qualité d'image. Pour JPEG, nous recommandons jpegtran ou jpegoptim (disponible sous Linux uniquement; exécuté avec l'option --strip-all). Pour PNG, nous recommandons OptiPNG ouPNGOUT.
Alors peut-être (si vous voulez vraiment vous en tenir aux suggestions de Google), vous pouvez utiliser la variable exec
de PHP pour exécuter l'un de ces outils sur les fichiers au fur et à mesure de leur téléchargement.
Pour compresser avec php, procédez comme suit (vous avez déjà l’impression de le faire):
Où $source_url
est l'image, $destination_url
est l'endroit où enregistrer et $quality
est un nombre compris entre 1 et 100 indiquant le niveau de compression jpeg à utiliser.
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;
}
Fonction réparée:
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;
}
Vous pouvez utiliser la classe Imagick pour cela. Considérez la fonction wrapper suivante:
<?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();
}
?>
En savoir plus sur la façon de redimensionner des images avec Imagick à l'adresse:
http://php.net/manual/fr/class.imagick.php
http://php.net/manual/en/imagick.resizeimage.phphttp://php.net/manual/en/imagick.constants.php # imagick.constants.filters