2011-01-27 2 views
-1

Я загружаю изображение на свой сайт. Изображение имеет ширину 498, а высота - 402. Мне нужно сделать предварительное изображение с установленной максимальной шириной 250 пикселей и максимальной высотой 250 пикселей, но изображение должно быть 250-250 и должно быть пропорционально ширине 250 пиксели.PHP пропорции изображения

Как это сделать?

EDIT

загружать изображения на сервер. Предел размера я хочу сделать 250 в ширину и 250 в высоту. Это не значит, что если я загружу изображение 1000х500, то он должен сделать 250х250, что означает, что ширина, которую мы делаем 250 пикселей, а высота пропорциональна первому измерению - 125. В конце концов, я должен получить изображение 250х125. Второй пример: у меня есть изображение 100х800. Я имею в виду, что он должен быть изменен

+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 для этих целей. Некоторые строки кода, как сделать 250x250 изображение и сохранить его:

$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 - будет 250x250 квадрат без потери пропорций.

+0

Если мое изображение имеет размеры 1000x100? Что я получу? – Isis

+0

проверьте этот пример: http://valokuva.org/?p=8, если у вас есть новая версия imagemagick, она сохранит пропорции. – Michael

0

вы можете использовать функцию getimagesize. он вернет массив

$ size = getimagesize ($ filename);

$ width = $ size [0];

$ height => $ size [1];

Тогда, так как ширина изображения выше, чем высота, умножить исходную ширину и высоту 250/498

+2

Просто fyi, этот путь чище: 'list ($ w, $ h) = getimagesize ($ filename);' – JakeParis

+0

конечно. Я просто пытался сосредоточиться на главной проблеме и сохранить все остальное просто. – naiquevin

3

Вот функция, которую я написал для создания эскизов с помощью GD. Вы можете передать максимальную ширину или высоту или оба (если нуль означает неограниченное), а уменьшенный размер будет масштабироваться до $dest (+ расширение файла) с сохраненными пропорциями. Он также работает с прозрачными изображениями. Любое дополнительное пространство должно быть полностью прозрачным; Если вам нужен другой фон, измените $img до imagecopyresampled().

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