2011-09-06 28 views
5

現在、Uploadifyに基づいてアップローダスクリプトをコーディングしています。今、私は与えられたイメージのサイズを変更し、サイズの1つに透かしを入れます。すべてうまくいきますが、高さのサイズを変更し、アスペクト比が乱れることがないように幅を切り抜くスクリプトが必要です。アスペクト比を保持したままGDで画像のサイズを変更して切り取る

これは、これまでの私のコードです:

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

誰かが私がこれを解決するのに役立つことができれば、私は本当に幸せになります。私はいくつかの方法を試してきましたが、どれも正しく動作していないようです。上からわかるように、変数 "bigImage"、 "mediumImage"、 "listImage"、および "thumbnail"で使用したいキャンバスサイズをすでに定義しています。

ありがとうございます! // Jonathan

+0

GDでこれを行うことができないことを覚えている限り、Imagickはこれらの可能性を提供します。 – markus

答えて

16

画像のサイズを変更する方法は複数あります。私はあなたのためにそれらを綴るます:

  • ストレッチを合わせて - 画像は、アスペクト比
  • Scale to fitを無視して所望の大きさにリサイズされた - イメージのサイズが変更され、その結果、一次元(幅または高さ)アスペクト比を維持しながら他のものと同じかそれより短いものが望ましい(短辺を単色で塗りつぶすために余分なステップが必要になることがある)。
  • Crop to fit - イメージのサイズが1つの次元(幅または高さ)アスペクト比を維持しながら他のものが同じかそれ以上の長さである(外側領域をトリミングするために1つの追加のステップが必要)

PS:両方の記事は私によって書かれました。

+0

ありがとう、私はあなたの記事を使用しようとしましたが、私は完全に黒い画像で終わります。なぜか分からないけど、コードを何度もやっているし、問題を見つけることができません。ここで私のコードはあなたの関数を使用しています:http://pastebin.com/XgDvUEWe – Jonathan

+0

申し訳ありません、私はそれを働かせて! :) – Jonathan

+0

@ジョナサン、私は問題を見つけるために完全なエラー報告を有効にした。あなたのペーストの改訂版はhttp://pastebin.com/J41aPe9g –

関連する問題