Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Обрезка картинки одинаково с каждой стороны
Форумы портала PHP.SU » » Графика в PHP » Обрезка картинки одинаково с каждой стороны

Страниц (1): [1]
 

1. dzheka3d - 03 Августа, 2011 - 20:02:03 - перейти к сообщению
Привет всем! У меня такой вот вопрос. Каким образом можно обрезать картинку одинаково с каждой стороны?
Я попробовал сделать вот так но не получается:

PHP:
скопировать код в буфер обмена
  1.  
  2. $org_size = getimagesize($fn);
  3. $point_dst_w = ($org_size[0] - $resivl)/2; $point_dst_h = 0;
  4. imagecopyresampled($dst, $src, 0, 0, $point_dst_w, $point_dst_h, $resivl, $resivl2, $resivl, $resivl2);
  5.  


$resivl Ширина картинки которую мы должны получить
Забавно, что если вместо этого: $org_size[0] - $resivl написать например "ширина картинки минус высота" то все получается, но это не логично же....
2. Arni - 03 Августа, 2011 - 20:47:32 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // Изменение размера изображения
  3. /***********************************************************************************
  4. Функция img_resize(): генерация thumbnails
  5. Параметры:
  6.   $src             - имя исходного файла
  7.   $dest            - имя генерируемого файла
  8.   $width, $height  - ширина и высота генерируемого изображения, в пикселях
  9. Необязательные параметры:
  10.   $rgb             - цвет фона, по умолчанию - белый
  11.   $quality         - качество генерируемого JPEG, по умолчанию - максимальное (100)
  12. ***********************************************************************************/
  13. function img_resize($src, $dest, $width, $height, $quality=100)
  14. {
  15.   if(!file_exists($src)) return 1; // исходный файля не найден
  16.   $size=getimagesize($src);
  17.   if($size===false) return 2; // не удалось получить параметры файла
  18.  
  19.   // Определяем исходный формат по MIME-информации и выбираем соответствующую imagecreatefrom-функцию.
  20.   $format=strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
  21.   $icfunc="imagecreatefrom".$format;
  22.   if(!function_exists($icfunc)) return 3; // не существует подходящей функции преобразования
  23.  
  24.   // Определяем необходимость преобразования размера так чтоб вписывалась наименьшая сторона
  25.   if( $width<$size[0] || $height<$size[1] )
  26.     $ratio = max($width/$size[0],$height/$size[1]);
  27.   else
  28.     $ratio=1;
  29.  
  30.   if($width/$size[0] > $height/$size[1]) { // срезать верх и низ
  31.     $dx = 0 ;
  32.     $dy = floor((($size[1] - $height) * $ratio) / 2) ; // отступ сверху
  33.   }
  34.   else { // срезать справа и слева
  35.     $dx = floor((($size[0] - $width) * $ratio) / 2) ; // отступ слева
  36.     $dy = 0 ;
  37.   }
  38.   // скока пикселов считывать с источника
  39.   $wsrc = floor($width/$ratio) ;  // по ширине
  40.   $hsrc = floor($height/$ratio) ; // по высоте
  41.  
  42.   $isrc=$icfunc($src);
  43.   $idest=imagecreatetruecolor($width,$height);
  44.  
  45.   imagecopyresampled($idest, $isrc, 0, 0, $dx, $dy, $width, $height, $wsrc, $hsrc);
  46.   imagejpeg($idest,$dest,$quality);
  47.   chmod($dest,0666);
  48.   imagedestroy($isrc);
  49.   imagedestroy($idest);
  50.   return 0; // успешно
  51.  
  52. }
3. dzheka3d - 03 Августа, 2011 - 21:31:09 - перейти к сообщению
Огромное спасибо! То что нужно!!!
То что нужно, но немного не правильно работает.

если исходная картинка имеет размер к примеру 800x500
А мы хотим получить картинки 300x188

То справа получается черная полоса

решил проблему вот так:

PHP:
скопировать код в буфер обмена
  1. if ($size[0]/$size[1] != $width/$height)
  2. {
  3.   if($width/$size[0] > $height/$size[1]) { // срезать верх и низ
  4.     $dx = 0 ;
  5.     $dy = floor((($size[1] - $height) * $ratio) / 2) ; // отступ сверху
  6.   }
  7.   else { // срезать справа и слева
  8.     $dx = floor((($size[0] - $width) * $ratio) / 2) ; // отступ слева
  9.     $dy = 0 ;
  10.   }
  11. }

 

Powered by ExBB FM 1.0 RC1