N-PN White-Hat Project
[Php] Thumbnail sur mesure par htaccess et librairies php GD - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages interprétés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=27)
+--- Sujet : [Php] Thumbnail sur mesure par htaccess et librairies php GD (/showthread.php?tid=1261)



[Php] Thumbnail sur mesure par htaccess et librairies php GD - CyberSee - 17-06-2011

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