2011-09-06 20 views
5

Aktualnie koduję skrypt przesyłający oparty na Uploadify. W tej chwili zmieniam rozmiar danego obrazu i znaku wodnego na jeden z rozmiarów. Wszystko działa dobrze, ale potrzebuję skryptu, aby zmienić wysokość, a następnie przyciąć szerokość, aby proporcje nie zostały pomieszane.Zmiana rozmiaru i przycinanie obrazu za pomocą GD przy zachowaniu proporcji obrazu

To jest mój kod do tej pory:

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); 
    } 

byłbym naprawdę szczęśliwy, jeśli ktoś może mi pomóc rozwiązać ten problem. Próbowałem kilku metod, ale żaden z nich nie działał poprawnie. Jak widać na górze, zdefiniowałem już rozmiary płótna, które chcę zastosować w zmiennych "bigImage", "mediumImage", "listImage" i "thumbnail".

Z góry dziękuję! // Jonathan

+0

O ile dobrze pamiętam, nie można tego zrobić z GD, Imagick zapewniłby jednak takie możliwości. – markus

Odpowiedz

16

Istnieje więcej niż jeden sposób zmiany rozmiaru obrazu. Ja pisze je dla Ciebie:

  • Stretch, aby dopasować - obraz zostanie przeskalowany do pożądanej wielkości ignorując proporcje
  • Scale to fit - obraz jest zmieniany tak, że jeden wymiar (szerokość lub wysokość) ma żądany rozmiar, podczas gdy drugi jest taki sam lub krótszy przy zachowaniu proporcji obrazu (jeden dodatkowy krok może być wymagany do wypełnienia krótszego boku jednolitym kolorem)
  • Crop to fit - obraz jest zmieniany w taki sposób, że jeden wymiar (szerokość lub wysokość) ma żądany rozmiar, podczas gdy drugi jest taki sam lub dłuższy, zachowując jednocześnie proporcje obrazu (jeden dodatkowy krok jest potrzebny do przycięcia zewnętrznego regionu)

PS: oba artykuły zostały napisane przeze mnie.

+0

Dzięki, spróbowałem użyć twojego artykułu, ale ostatecznie otrzymałem całkowicie czarny obraz. Nie wiem dlaczego, ale kilka razy przeszedłem kod i nie mogę znaleźć problemu. Oto mój kod wykorzystujący twoje funkcje: http://pastebin.com/XgDvUEWe – Jonathan

+0

Przepraszam, mam to działa! :) – Jonathan

+0

@ Jonathan, włączyłem pełne zgłaszanie błędów, aby zlokalizować problem; poprawiona wersja pasty jest dostępna pod adresem http://pastebin.com/J41aPe9g –