суббота, 4 декабря 2010 г.

Уменьшение изображения в PHP

Многие начинающие PHP-разработчики задаются вопросом - как уменьшить изображение, переданное пользователем? Это очень просто, поэтому приведённая ниже функция будет не только пропорционально уменьшать изображение, но и обрезать края, выходящие за рамки заданного соотношения сторон. Также будет сохранён альфа-канал (прозрачность) изображения, если он в нём присутствовал.

Примечание. Эта функция основана на использовании библиотеки GD2. Возможно, не самый быстрый вариант, но библиотека GD2 изначально подключена на большинстве хостингов.

//$image - исходное изображение, созданное функцией imagecreatefrompng или подобными
//$width - ширина уменьшенного изображения
//$height - высота уменьшенного изображения
function GetResampledImage($image, $width, $height)
{
   //Сохраняем длину и ширину исходного изображения
   $widthOriginal = imagesx($image);
   $heightOriginal = imagesy($image);

   //Объявляем переменные для размеров пропорционально сжатого изображения (без обрезки)
   //Изначально приравниваем их к размерам уменьшенного изображения
   $widthSampled = $width ;
   $heightSampled = $height;

   //Вычисляем коэффициенты соотношения сторон уменьшенного и исходного изображений
   $aspect = $height / (float)$width;
   $aspectOriginal = $heightOriginal / (float)$widthOriginal;

   //Вычисляем соотношение коэффициентов
   $aspectAspect = $aspect / $aspectOriginal;

   //Объявляем переменные для смещения изображения (нужно для обрезки)
   $dX = 0;
   $dY = 0;

   //Вычисляем размеры пропорционально сжатого изображения (без обрезки) и смещение изображения
   if($aspectAspect > 1)
   {
      $widthSampled *= $aspectAspect;
      $dX = ($widthSampled - $width) / 2;
   }
   else
   {
      $heightSampled /= $aspectAspect;
      $dY = ($heightSampled - $height) / 2;
   }


   //Создаём прозрачное изображение для вывода уменьшенного изображения
   $imageResult = imagecreatetruecolor($width, $height);
   imagesavealpha($imageResult, true);
   imagefill($imageResult, 0, 0, imagecolorallocatealpha($imageResult, 0, 0, 0, 127));
  
   //Создаём прозрачное изображение для хранения пропорционально сжатого изображения
   $imageSampled = imagecreatetruecolor($widthSampled, $heightSampled);
   imagesavealpha($imageSampled, true);
   imagefill($imageSampled, 0, 0, imagecolorallocatealpha($imageSampled, 0, 0, 0, 127));

   //Пропорционально сжимаем исходное изображение
   imagecopyresampled($imageSampled, $image, 0, 0, 0, 0, $widthSampled, $heightSampled, $widthOriginal, $heightOriginal);

   //Обрезаем пропорционально сжатое изображение 
   imagecopy($imageResult, $imageSampled, 0, 0, $dX, $dY, $widthSampled, $heightSampled);

   return $imageResult;
}

Полученное изображение можно сохранить с помощью функции imagepng() или подобных ей.

Комментариев нет:

Отправить комментарий

Мои записи и на Я.ру — levelost!