Salut tout le monde :-)
Dernièrement, dans un des sites que j’ai faits pour une photographe, j’ai dû mettre sur pied un système qui permet de réduire les photos automatiquement ... Au début, j'avais pensée créée 3 images pour chaque upload ... Une version petite, une version grande plus l'original. Sauf que la cliente en question en avait, plus de 500 à uploadé. Donc histoire d'utiliser moin d'espace j’ai changé ma stratégie.
J’ai mis sur pied un système qui permet de fabriquer des versions miniaturiser appartir de l'original en utilisant la librairie GD ce qui permet d'uploader seulement qu'une seule fois l'image puis avoir n'importe quelle grandeur compresser a soin pour une ouverture plus rapide de la page et tout cela sur demande a partir de l'original.
Fichier: image.php
Code PHP :
<?
// Fichier ou ce trouve tout les images
$fichier = "media/original";
// Une erreur c'est produit... on l'affiche
function diewith($msg) {
header("HTTP/1.0 500 Internal error."); // On change le header pour pouvoir afficher le message
echo $msg;
die;
}
// On récupère les variables passer en GET
$uri = $_REQUEST['uri'] or diewith("Manque l'URL de l'image");
$inWidth = $_REQUEST['w'];
$inHeight = $_REQUEST['h'];
$method=$_REQUEST['method'];
// Ou essaye d'ouvrir l'image
$srcTime = @filemtime($uri) or diewith("Impossible d'ouvrir l'image");
$reqTimeStr = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']);
// On vérifie si la date du cache est a jour
if ((! empty($reqTimeStr)) and ($srcTime <= strtotime($reqTimeStr))) {
header("HTTP/1.1 304 Not modified");
exit;
} else {
header("Last-Modified: " . date('r', $srcTime));
}
// On va chercher les informations sur l'image
$imgInfo = getimagesize($uri) or diewith("Impossible d'ouvrir l'image");
$srcWidth = $imgInfo[0]; // largeur
$srcHeight = $imgInfo[1]; // hauteur
$srcType = $imgInfo[2]; // type de fichier
switch($srcType) {
case 1 : $srcType = "gif"; break;
case 2 : $srcType = "jpeg"; break;
case 3 : $srcType = "png"; break;
default: $srcType = "???";
}
// On applique la grandeur si la méthode stretch est choisie
if ($method == "stretch") {
$outWidth = $inWidth;
$outHeight = $inHeight;
} else { // On applique la méthode fit
$xRatio = ($inWidth) ? ($srcWidth / $inWidth) : 0;
$yRatio = ($inHeight) ? ($srcHeight / $inHeight): 0;
$ratio = max($xRatio, $yRatio, 1);
$outWidth = intval($srcWidth / $ratio);
$outHeight = intval($srcHeight/ $ratio);
}
// On fabrique le nom de l'image en cache
$cacheName = md5($uri).'-'.basename($uri).'#'.$outWidth.'x'.$outHeight;
$cacheFile = dirname(__FILE__) . '/'. $fichier . '/' . $cacheName;
// Si le cache est trop vieux ou exist pas on le créé
if (!file_exists($cacheFile) or ($srcTime > filectime($cacheFile))) {
if ($imgInfo[0]<$outWidth){$outWidth=$imgInfo[0];}
if ($imgInfo[1]<$outHeight){$outHeight=$imgInfo[1];}
// On créé l'image de sortie
$outImg = imagecreatetruecolor ($outWidth, $outHeight);
// On load la source de l'image
switch($srcType) {
case "png":
$srcImg = imagecreatefrompng($uri);
$blending = false;
break;
case "gif":
$srcImg = imagecreatefromgif($uri);
$blending = true;
break;
case "jpeg":
$srcImg = imagecreatefromjpeg($uri);
break;
default:
diewith("Le fichier utilise une extension non supportée '$uri'");
};
// On applique la nouvelle grandeur a l'image
imagecopyresampled($outImg, $srcImg, 0, 0, 0, 0, $outWidth, $outHeight, $srcWidth, $srcHeight);
// On sauvegarde l'image dans le cache
switch($srcType) {
case "png":
$res = imagepng($outImg, $cacheFile);
break;
case "gif":
$res = imagegif($outImg, $cacheFile);
break;
case "jpeg":
$res = imagejpeg($outImg, $cacheFile);
break;
default:
diewith("Type de fichier non supporté '$uri'");
}
// On vérifie que sa bien marcher
if (!$res) diewith("Impossible de sauvegarder '$cacheFile'. Vérifier les droits HTTP du serveur.");
}
// HTTP Header
header("Content-Type:image/$srcType");
// On affiche l'image
readfile($cacheFile) or diewith("Impossible d'ouvrir '$cacheFile'");
?>
Avec ce bout de code, on peut resizer n'importe qu'elle image en changeant
Code :
<img src="image.jpg">
En
Code :
<img src="image.php?method=fit&w=100&h=100&uri=image.jpg">
ce qui donnerait une image 100x100
J'ai fabriquer 2 méthode fit et strech
Ma cliente avait le souci que les images soit bien indexer par google. Et puisque les images ce terminait par ".php" plutôt que ".jpg" j’ai du ajouter un code de redirection par htaccess afin que l'image garde son extension
Fichier .htaccess
Code :
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)~(.*)x(.*)$ ./thumbs.php?uri=$1&w=$2&h=$3&method=fit
RewriteRule ^(.*)~(.*)$ ./thumbs.php?uri=$1&w=$2&h=$2&method=fit
RewriteRule ^(.*)=(.*)x(.*)$ ./thumbs.php?uri=$1&w=$2&h=$3&method=stretch
</IfModule>
Ce qui fait que le code pour appeler un image devient
Code :
<img src="image.jpg~100x100">
Pour fabriquer le ~ il suffit de faire "Alt 126"
Veillez cité la source et l'auteur si vous désirer reprendre mon tuto.
Soyez intelligent et restez WhiteHat!
Par CyberSee