2011-01-27 6 views
-1

イメージを自分のサイトにアップロードします。画像の幅は498、高さは402です。 確立された最大幅250px、最大高さ250pxのプレビュー画像を作成する必要がありますが、画像は250〜250で250の幅に比例する必要がありますピクセル。PHPイメージの割合

どうすればよいですか?私はあなたのサーバーに画像をアップロード

EDIT

。幅250インチ、高さ250インチにしたいサイズの限界。 これは、イメージ1000h500をアップロードした場合、250x250を実行しなければならないという意味ではありません。つまり、250ピクセル、高さは最初の次元に比例します125。最後に、画像250x125。 2番目の例:画像が100h800です。私はそれを変更する必要があることを意味する

+3

これは非常に明確ではありません。必要なものを書き直したり、いくつかの視覚的な例や他のものを与えてください。 – JakeParis

+0

@JMCが言ったことは、特に、どのように比率を扱うべきかと言いました。 – Trufa

答えて

-1
function makeThumbnail($image, $dest) 
    { 
     $imageType = exif_imagetype($image); 

     switch ($imageType) 
     { 
      case IMAGETYPE_JPEG: 
       $img = imagecreatefromjpeg($image); 
       break; 
      case IMAGETYPE_PNG: 
       $img = imagecreatefrompng($image); 
       break; 
      case IMAGETYPE_GIF: 
       $img = imagecreatefromgif($image); 
       break; 
      default: 
       throw new Im_Exception('Bad extension'); 
     } 

     $width = imagesx($img); 
     $height = imagesy($img);   

     if ($height > $width) 
     { 
      $ratio = 250/$height; 
      $newHeight = 250; 
      $newWidth = $width * $ratio; 
     } 
     else 
     { 
      $ratio = 250/$width; 
      $newWidth = 250; 
      $newHeight = $height * $ratio; 
     } 

     $previewImg = imagecreatetruecolor($newWidth, $newHeight); 

     $palsize = ImageColorsTotal($img); 
     for ($i = 0; $i < $palsize; $i++) 
     { 
      $colors = ImageColorsForIndex($img, $i); 
      ImageColorAllocate($previewImg, $colors['red'], $colors['green'], $colors['blue']); 
     } 

     imagecopyresized($previewImg, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 

     switch ($imageType) 
     { 
      case IMAGETYPE_JPEG: 
       $ext = 'jpg'; 
       imagejpeg($previewImg, $dest . '.' . $ext); 
       break; 
      case IMAGETYPE_PNG: 
      case IMAGETYPE_GIF: 
       $ext = 'png'; 
       imagesavealpha($previewImg, true); 
       imagepng($previewImg, $dest . '.' . $ext, 9); 
       break; 
      default: 
       throw new Im_Exception(); 
     } 
     imagedestroy($previewImg); 
     imagedestroy($img); 
    } 
+1

私と同じ、あまりパラメータ化されていないコピー... –

1

私はこの目的のためにImageMagickクラスを使用することをお勧めします。 250×250の画像を作成し、それを保存するためにどのようにコードの いくつかの文字列、:

$img = new Imagick('/path/to/image/image.jpg'); //image.jpg - your file 
$img->cropThumbnailImage(250, 250); //make thumbnail 250x250 
$img->writeImage('/newptah/newfilename.jpg'); //write thumbnail to new path 
$img->destroy(); //free resources 

newfilename.jpgは - 割合を失うことなく、250×250の正方形になります。

+0

画像のサイズが1000×100の場合は?私は何を得ますか? – Isis

+0

この例を確認してください:http://valokuva.org/?p=8 imagemagickの新しいバージョンをお持ちの場合、それは意図された比率を維持します。 – Michael

0

あなたはgetimagesize関数を使用できます。配列を返します

$ size = getimagesize($ filename);

$ width = $ size [0];

$ height => $ size [1];その後

、あなたのイメージの幅が高さよりも大きいので、498分の250

+2

ちょうどfyi、この方法はクリーナーです: 'list($ w、$ h)= getimagesize($ filename);' – JakeParis

+0

もちろん。私は主な問題に集中し、他のすべてを単純なものに保つことを試みていました。 – naiquevin

3

により元の幅と高さを掛けここで私はGDを使用してサムネイルを生成するために書いた機能です。最大幅または高さ、または両方を渡すことができます(ゼロの場合は制限なしを意味します)、サムネイルは比率がそのままの状態で$dest(+ファイル拡張子)にスケーリングされます。また、透過画像でも動作します。残りの余分なスペースは完全に透明でなければなりません。別の背景が必要な場合は、imagecopyresampled()の前に$imgを変更してください。

function picThumb($src, $dest, $width = 0, $height = 0, $quality = 100) 
    { 
    $srcType = exif_imagetype($src); 

    if (!$width && !$height) 
     { 
     $ext = image_type_to_extension($srcType, false); 
     copy($src, $dest . '.' . $ext); 
     return $ext; 
     } 

    ini_set('memory_limit', '134217728'); 
    try 
     { 
     switch ($srcType) 
      { 
      case IMAGETYPE_JPEG: 
       $srcImg = imagecreatefromjpeg($src); 
       break; 
      case IMAGETYPE_PNG: 
       $srcImg = imagecreatefrompng($src); 
       break; 
      case IMAGETYPE_GIF: 
       $srcImg = imagecreatefromgif($src); 
       break; 
      default: 
       throw new Exception(); 
      } 
     $srcWidth = imagesx($srcImg); 
     $srcHeight = imagesy($srcImg); 
     if (!$srcWidth || !$srcHeight) 
      { 
      throw new Exception(); 
      } 

     if ($width && $height) 
      { 
      $ratio = min($srcWidth/$width, $srcHeight/$height); 
      $areaWidth = round($width * $ratio); 
      $areaHeight = round($height * $ratio); 
      $areaX = round(($srcWidth - $areaWidth)/2); 
      $areaY = round(($srcHeight - $areaHeight)/2); 
      } 
     else // if (!$width || !$height) 
      { 
      if ($width) 
       { 
       $height = round($width/$srcWidth * $srcHeight); 
       } 
      else // if ($height) 
       { 
       $width = round($height/$srcHeight * $srcWidth); 
       } 
      $areaWidth = $srcWidth; 
      $areaHeight = $srcHeight; 
      $areaX = 0; 
      $areaY = 0; 
      } 

     $img = imagecreatetruecolor($width, $height); 
     imagealphablending($img, false); 
     imagecopyresampled($img, $srcImg, 0, 0, $areaX, $areaY, $width, $height, $areaWidth, $areaHeight); 

     switch ($srcType) 
      { 
      case IMAGETYPE_JPEG: 
       $ext = 'jpg'; 
       imagejpeg($img, $dest . '.' . $ext, $quality); 
       break; 
      case IMAGETYPE_PNG: 
      case IMAGETYPE_GIF: 
       $ext = 'png'; 
       imagesavealpha($img, true); 
       imagepng($img, $dest . '.' . $ext, 9); 
       break; 
      default: 
       throw new Exception(); 
      } 

     imagedestroy($srcImg); 
     imagedestroy($img); 
     } 
    catch (Exception $e) 
     { 
     ini_restore('memory_limit'); 
     throw $e; 
     } 
    ini_restore('memory_limit'); 

    return $ext; 
    } 
関連する問題