2011-09-06 16 views
5

Attualmente sto codificando uno script uploader basato su Uploadify. In questo momento ridimensiono l'immagine e filigrana una delle dimensioni. Funziona tutto bene, ma ho bisogno dello script per ridimensionare l'altezza e ritagliare la larghezza in modo che le proporzioni non vengano incasinate.Ridimensionamento e ritaglio dell'immagine con GD mantenendo le proporzioni

Questo è il mio codice finora:

if ($fileExtension == "jpg" || 
     $fileExtension == "jpeg" || 
     $fileExtension == "png" || 
     $fileExtension == "gif"){ 

     // GD variables: 
     list($width, $height, $type) = GetImageSize($uploadedFile['tmp_name']); 

     // Image sizes: 
     $bigImage = array(800, 453); 
     $mediumImage = array(410, 231); 
     $listImage = array(120, 68); 
     $thumbnail = array(90, 51); 

     $sourceAspect = $width/$height; 
     $bigAspect = $bigImage[0]/$bigImage[1]; 
     $mediumAspect = $mediumImage[0]/$mediumImage[1]; 
     $listAspect = $listImage[0]/$listImage[1]; 
     $thumbnailAspect = $thumbnail[0]/$thumbnail[1]; 

     // Image is PNG: 
     if ($type == IMAGETYPE_PNG){ 
      $image = imagecreatefrompng($uploadedFile['tmp_name']); 
      $valid = true; 
     } 

     // Image is JPEG: 
     else if ($type == IMAGETYPE_JPEG){ 
      $image = imagecreatefromjpeg($uploadedFile['tmp_name']); 
      $valid = true; 
     } 

     // Image is GIF: 
     else if ($type == IMAGETYPE_GIF){ 
      $image = imagecreatefromgif($uploadedFile['tmp_name']); 
      $valid = true; 
     } 

     // Format not allowed: 
     else { 
      $valid = false; 
     } 

     // Start creating images: 
     if ($valid){ 

      // Get size: 
      $imageSize = getimagesize($uploadedFile['tmp_name']); 

      // Generate canvas: 
      $bCanvas = imagecreatetruecolor($bigImage[0], $bigImage[1]); 
      $mCanvas = imagecreatetruecolor($mediumImage[0], $mediumImage[1]); 
      $lCanvas = imagecreatetruecolor($listImage[0], $listImage[1]); 
      $tCanvas = imagecreatetruecolor($thumbnail[0], $thumbnail[1]); 

      // Copy content: 
      imagecopyresampled($bCanvas, $image, 0, 0, 0, 0, ($bigImage[0] * $sourceAspect), ($bigImage[1]/$sourceAspect), $imageSize[0], $imageSize[1]); 
      imagecopyresampled($mCanvas, $image, 0, 0, 0, 0, $mediumImage[0], $mediumImage[1], $imageSize[0], $imageSize[1]); 
      imagecopyresampled($lCanvas, $image, 0, 0, 0, 0, $listImage[0], $listImage[1], $imageSize[0], $imageSize[1]); 
      imagecopyresampled($tCanvas, $image, 0, 0, 0, 0, $thumbnail[0], $thumbnail[1], $imageSize[0], $imageSize[1]); 

      // Save images: 
      $saveB = imagejpeg($bCanvas, $targetFile.'_big.jpg', 90); 
      $saveM = imagejpeg($mCanvas, $targetFile.'_medium.jpg', 90); 
      $saveT = imagejpeg($lCanvas, $targetFile.'_list.jpg', 90); 
      $saveT = imagejpeg($tCanvas, $targetFile.'_thumb.jpg', 90); 

      // Destroy images: 
      imagedestroy($image); 
      imagedestroy($bCanvas); 
      imagedestroy($mCanvas); 
      imagedestroy($lCanvas); 
      imagedestroy($tCanvas); 

      // Watermark images: 
      $mark = imagecreatefrompng("logo.png"); 
      list($mwidth, $mheight) = getimagesize("logo.png"); 
      $img = imagecreatefromjpeg($targetFile.'_big.jpg'); 

      list($bwidth, $bheight) = getimagesize($targetFile.'_big.jpg'); 
      imagecopy($img, $mark, $bwidth-$mwidth-25, $bheight-$mheight-25, 0, 0, $mwidth, $mheight); 
      imagejpeg($img, $targetFile.'_big.jpg', 100); 
      imagedestroy($img); 

     } else { 
      echo "0"; 
     } 

    } else { 
     move_uploaded_file($tempFile,$targetFile.'.'.$fileExtension); 
    } 

Sarei davvero felice se qualcuno potesse aiutarmi a risolvere questo. Ho provato diversi metodi ma nessuno di loro sembrava funzionare correttamente. Come puoi vedere in alto, ho già definito le dimensioni del canvas che voglio utilizzare nelle variabili "bigImage", "mediumImage", "listImage" e "thumbnail".

Grazie in anticipo! // Jonathan

+0

Per quanto mi ricordi che non puoi farlo con GD, Imagick fornirebbe comunque queste possibilità. – markus

risposta

16

C'è più di un modo per ridimensionare un'immagine. Io li precisare per voi:

  • Stretch per adattarsi - l'immagine viene ridimensionata alla dimensione desiderata ignorando proporzioni
  • Scale to fit - l'immagine viene ridimensionata in modo che una sola dimensione (larghezza o altezza) ha le dimensioni desiderate mentre l'altra è uguale o inferiore mantenendo le proporzioni (potrebbe essere necessario un ulteriore passaggio per riempire il lato più corto con un colore solido)
  • Crop to fit - l'immagine viene ridimensionata in modo che una dimensione (larghezza o altezza) ha le dimensioni desiderate mentre l'altra è uguale o più lunga pur mantenendo le proporzioni (è necessario un ulteriore passo per tagliare l'area esterna)

PS: entrambi gli articoli sono stati scritti da me.

+0

Grazie, ho provato a usare il tuo articolo ma finisco con un'immagine completamente nera. Non so perché, ma sono stato sopra il codice più volte e non riesco a trovare il problema. Ecco il mio codice usando le tue funzioni: http://pastebin.com/XgDvUEWe – Jonathan

+0

Scusa, ho funzionato! :) – Jonathan

+0

@ Jonathan, ho abilitato la segnalazione completa degli errori per individuare il problema; versione riveduta della tua pasta è disponibile su http://pastebin.com/J41aPe9g –

Problemi correlati