2011-09-06 18 views
5

Tôi hiện đang mã hóa tập lệnh trình tải lên dựa trên Tải lên. Ngay bây giờ tôi thay đổi kích thước hình ảnh nhất định và watermark một trong các kích cỡ. Tất cả đều hoạt động tốt, nhưng tôi cần kịch bản để thay đổi kích thước chiều cao và sau đó cắt chiều rộng sao cho tỷ lệ cỡ ảnh không bị rối tung lên.Thay đổi kích thước và cắt xén hình ảnh bằng GD trong khi vẫn giữ tỷ lệ khung hình

Đây là mã của tôi cho đến nay:

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

Tôi sẽ thực sự hạnh phúc nếu ai đó có thể giúp tôi giải quyết việc này. Tôi đã thử một số phương pháp nhưng không ai trong số họ dường như làm việc đúng cách. Như bạn có thể thấy ở trên cùng, tôi đã xác định kích thước canvas mà tôi muốn sử dụng trong các biến "bigImage", "mediumImage", "listImage" và "thumbnail".

Cảm ơn trước! // Jonathan

+0

Theo như tôi nhớ bạn không thể làm điều đó với GD, Imagick sẽ cung cấp những khả năng này mặc dù. – markus

Trả lời

16

Có nhiều cách để thay đổi kích thước hình ảnh. Tôi sẽ đánh vần chúng ra cho bạn:

  • Stretch để phù hợp - hình ảnh được thay đổi kích cỡ để kích thước mong muốn bỏ qua tỉ lệ
  • Scale to fit - hình ảnh được thay đổi kích cỡ để một kích thước (chiều rộng hoặc chiều cao) có kích thước mong muốn, còn kích thước khác bằng hoặc nhỏ hơn trong khi vẫn duy trì tỷ lệ khung hình (một bước bổ sung có thể được yêu cầu để điền vào mặt ngắn hơn với màu đồng nhất)
  • Crop to fit - hình ảnh được thay đổi kích thước sao cho một chiều (chiều rộng hoặc chiều cao) có kích thước mong muốn trong khi hình kia giống hoặc dài hơn trong khi vẫn duy trì tỷ lệ khung hình (cần thêm một bước để cắt khu vực bên ngoài)

PS: cả hai bài viết đều được viết bởi tôi.

+0

Cảm ơn, tôi đã cố gắng sử dụng bài viết của bạn nhưng tôi kết thúc với một hình ảnh hoàn toàn màu đen. Tôi không biết tại sao, nhưng tôi đã qua mã nhiều lần và tôi không thể tìm thấy vấn đề. Đây là mã của tôi sử dụng các chức năng của bạn: http://pastebin.com/XgDvUEWe – Jonathan

+0

Xin lỗi, tôi đã làm việc đó! :) – Jonathan

+0

@ Jonathan, tôi đã bật báo cáo lỗi đầy đủ để xác định sự cố; phiên bản sửa đổi của dán của bạn có sẵn tại http://pastebin.com/J41aPe9g –