Je vais vous présenter un script qui va vous permettre de redimensionner ou rogner vos images à la volée, sans pour autant stocker le résultat sur le serveur! L’exemple de redimensionnement à la volé !
Ce script va comparer la hauteur et la largeur d’origine de l’image et celles que vous lui demandez.
Si l’image peut être réduite ou agrandie sans que cela ne la déforme énormément, la fonction va la redimensionner.
Sinon elle va la redimensionner à sa plus grande taille (en fonction de la hauteur et largeur que vous souhaitez), puis elle va la rogner afin d’avoir la taille souhaitée!
Pour ajouter du fun dans tout ça, on va utiliser l’Url Rewriting.
Nos images vont donc être appelées depuis une page web, comme les autres !
c’est à dire :
<img src="http://www.mysite.com/folder/Image-20-30.jpg" alt="" />
Alors que si nous n’utilisons pas l’Url Rewriting ça donne :
<img src="http://www.mysite.com/resize.php?folder=Folder&file=Image&height=20&width=30" alt="" />
Voici le contenu du fichier .htaccess :
# Options Options +FollowSymlinks Options -indexes ################ # URL Rewriting ################ # Rewriting - Activation RewriteEngine on # [IMAGE] : http://.../dossier/image-HAUTEUR-LARGEUR.jpg RewriteRule ^([a-z]+)/(.+)-([0-9]+)-([0-9]+).jpg resize.php?dossier=$1&picture=$2&height=$3&width=$4 [L]
Et voila le contenu du fichier PHP :
$baseDir = $_SERVER['DOCUMENT_ROOT'].'/';
$folder = $baseDir.$_GET['dossier'].'/'.$_GET['picture'].'.jpg';
$height = $_GET['height'];
$width = $_GET['width'];
header('Pragma: no-cache');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // On est sûr que cela ne reste pas dans le cache du navigateur
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-type: image/jpg');
imagejpeg(resize($folder, $width, $height));
function resize( $folder, $width, $height ){
// récupération de la taille de l'image d'origine
list($currentWidth, $currentHeight) = getimagesize($folder);
$calW = ceil(($height/$currentHeight)*$currentWidth);
$calH = ceil(($width/$currentWidth)*$currentHeight);
$ratioW = ($calW == 0 || $width == 0)? 0 : $calW % $width;
$ratioH = ($calH == 0 || $height == 0)? 0 : $calH % $height;
if($ratioW < 10 && $ratioH < 10) {
return img_resize($folder, $width, $height);
} else {
$img = img_resize_auto($folder, $width, $height);
return img_rogne_resize($folder, $width, $height, $img);
}
}
/**
* Redimensionne une image pour une largeur fixée
*/
function img_resize_x ( $filename, $maxWidth, $maxHeight ) {
// récupération de la taille de l'image d'origine
list($currentWidth, $currentHeight) = getimagesize($filename);
$ratio = $currentWidth / $currentHeight;
$newWidth = $maxWidth;
$newHeight = round($newWidth / $ratio);
$newHeight = ($maxHeight > $newHeight)? $maxHeight : $newHeight;
return img_resize($filename, $newWidth, $newHeight);
} // end of 'img_resize_x()'
/**
* Redimensionne une image pour une hauteur fixée
*/
function img_resize_y ( $filename, $maxHeight, $maxWidth ) {
// récupération de la taille de l'image d'origine
list($currentWidth, $currentHeight) = getimagesize($filename);
$ratio = $currentWidth / $currentHeight;
$newHeight = $maxHeight;
$newWidth = round($newHeight * $ratio);
$newWidth = ($maxWidth > $newWidth)? $maxWidth : $newWidth;
return img_resize($filename, $newWidth, $newHeight);
} // end of 'img_resize_y()'
function img_resize_auto( $filename, $maxW, $maxH ) {
// récupération de la taille de l'image d'origine
list($width, $height) = getimagesize($filename);
if ($maxW > $maxH) {
return img_resize_x($filename, $maxW, $maxH);
} else {
return img_resize_y($filename, $maxH, $maxW);
}
} // end of 'img_resize_auto()'
/**
* Retourne l'image redimentionnée
*/
function img_resize( $filename, $newWidth, $newHeight ) {
// récupération de la taille de l'image d'origine
list($currentWidth, $currentHeight) = getimagesize($filename);
// Création de la miniature
$srcImg = @imagecreatefromjpeg($filename);
if ( !$srcImg ) {
$im = imagecreate(150, 30); // Création d'une image blanche
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
// Affichage d'un message d'erreur
imagestring($im, 1, 5, 5, "Erreur de chargement de l'image ".basename($filename), $tc);
return $im;
}
$dstImg = @imagecreatetruecolor($newWidth, $newHeight);
imagecopyresized($dstImg, $srcImg, 0, 0, 0, 0, $newWidth, $newHeight, $currentWidth, $currentHeight);
return $dstImg;
} // end of 'img_resize()'
/**
* Retourne une image rognée
*/
function img_rogne_resize($filename, $width, $height, $image = FALSE){
// récupération de la taille de l'image d'origine
list($width_orig, $height_orig) = getimagesize($filename);
$height_orig2=$height_orig/($width_orig/$width);
$image_p = imagecreatetruecolor($width, $height);
if(!$image) {
$image = imagecreatefromjpeg($filename);
}
imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height);
return $image_p;
}
Pour l’utiliser c’est assez simple. Il vous suffit de créer un dossier qui va contenir le fichier .htaccess et le fichier php que vous nommerez « resize.php ».
Maintenant vous n’avez plus qu’à intégrer vos images avec une Url du type : http://www.monsite.com/le_repertoire_des_images/le_nom_de_l_image-sa_hauteur-sa_largeur.jpg
si vous cherchez juste des fonctions simples et efficaces pour le redimensionnement d’images ça se passe par là chez Pilgrim.Maleo