2008-11-18 3 views
0
$sourcePath = 'images/'; // Path of original image 
$sourceUrl = ''; 
$sourceName = 'photo1.jpg'; // Name of original image 
$thumbPath = 'thumbs/'; // Writeable thumb path 
$thumbUrl = 'thumbs/'; 
$thumbName = "test_thumb.jpg"; // Tip: Name dynamically 
$thumbWidth = 100; // Intended dimension of thumb 

// Beyond this point is simply code. 
$sourceImage = imagecreatefromjpeg("$sourcePath/$sourceName"); 
$sourceWidth = imagesx($sourceImage); 
$sourceHeight = imagesy($sourceImage); 

$targetImage = imagecreate($thumbWidth,$thumbWidth); 
imagecopyresized($targetImage,$sourceImage,0,0,0,0,$thumbWidth,$thumbWidth,imagesx($sourceImage),imagesy($sourceImage)); 
imagejpeg($targetImage, "$thumbPath/$thumbName"); 

// By now, the thumbnail is copied into the $thumbpath 
// as the file name specified in $thumbName, so display 
echo "<img src='$thumbUrl$thumbName' alt=''>"; 

Le code ci-dessus me donne une vignette et c'est génial, mais la qualité de l'image est horrible. Il semble que l'image ait été inversée et qu'elle semble avoir été écrasée. J'ai eu des maux de tête toute la journée. Quelqu'un a des idées?Générer des vignettes en utilisant PHP provoque une mauvaise qualité d'image

Répondre

1

Essayez:

imagejpeg($targetImage, "$thumbPath/$thumbName", 100); 
7

Le troisième paramètre vaut d'être inclus comme le souligne Dominic. Il spécifie la qualité du JPEG. Dans le cas de "et il semble qu'il a été écrasé", rappelez-vous que vous créez une vignette carrée à partir d'une image source qui peut être carrée ou non. Une façon de contourner ce problème est de travailler avec les dimensions de la source pour calculer une largeur ou une hauteur complète (selon que l'image est en mode portrait ou paysage) pour copier à partir de la source. Cela signifie remplacer le "0,0,0,0" de vos arguments par imagecopyresized() avec quelque chose de dynamiquement calculé.

(EDIT: exemple)

function makeSquareThumb($srcImage, $destSize, $destImage = null) { 
    //I'm sure there's a better way than this, but it works... 
    //I don't like my folder and file checking in the middle, but need to illustrate the need for this. 

    $srcFolder = dirname($srcImage); //source folder 
    $srcName = basename($srcImage); //original image filename 

    //the IF ELSEIF ELSE below is NOT comprehensive - eg: what if the dest folder is the same as the source? 
    //writeable nature of the destination is not checked! 
    if(!destImage) { 
     $destFolder = $srcFolder.'/thumbs/'; 
     if(!is_dir($destFolder)) { 
      //make the thumbs folder if there isn't one! 
      mkdir($destFolder); 
     } 
     $destImage = $destFolder.$srcName; 
    } elseif (is_dir($destImage)) { 
     $destFolder = $destImage; 
     $destImage = $destFolder.'/'.$srcName; 
    } else { 
     $destFolder = dirname($destImage); 
    } 


    //Now make it! 
    $srcCanvas = imagecreatefromjpeg($srcImage); 
    $srcWidth = imagesx($srcCanvas); 
    $srcHeight = imagesy($srcCanvas); 

    //this let's us easily sample a square from the middle, regardless of apsect ratio. 
    $shortSide = array($srcWidth,$srcHeight); 
    sort($shortSide); 

    $src_x = $srcWidth/2 - $shortSide[0]/2; 
    $src_y = $srcHeight/2 - $shortSide[0]/2; 

    //do it! 
    $destCanvas = imagecreatetruecolor($destSize, $destSize); 
    imagecopyresampled($destCanvas,$srcCanvas,0,0,$src_x,$src_y,$destSize,$destSize,$shortSide[0],$shortSide[0]); 
    imagejpeg($destCanvas, $destImage); 
} 
+0

Merci beaucoup! :RÉ – Drew

Questions connexes