Redimensionner et rogner une image en php

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

Tagués avec : , , , ,
Publié dans PHP

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*