Вырезание центра изображения для миниатюр

Beckie

Новичок
Вырезание центра изображения для миниатюр

Уже замучался, прочитал в мануале, но почему-то не получается.

Допустим картинка 367 x 599 , мне нужна миниатюра размером в 130x100. То есть, все лишнее должно обрезаться, чтобы пропорции картинки сохранились.
 

SiMM

Новичок
Курить надо не мануал по PHP, а учебник по школьному курсу математики.
 

Beckie

Новичок
Автор оригинала: SiMM
Курить надо не мануал по PHP, а учебник по школьному курсу математики.
Автор оригинала: Mr_Max
ДА :D
Хотелось бы ваши варианты посмотреть господа присяжные. :)

Пока получилось сделать заготовку для повторного сжатия, до миниатюры в 130 на 100.

PHP:
$nm = imagecreatetruecolor($ox,round($oy / 2));
imagecopyresampled($nm, $im,0,0,0,round(($oy / 2) - ($oy / 4)),$ox,$oy,$ox,$oy);
Но хотелось бы узнать, как это сделать без повторного прогона.
PHP:
$nm = imagecreatetruecolor(130,round($oy * (130 / $ox)));
imagecopyresampled($nm, $im,0,0,0,0,130,round($oy * (130 / $ox)),$ox,$oy);
Ктонибуть подскажет?

Тогда останется предпринять действия относительно пропорциональности

$prop = $ox / $oy;

if($prop < 0.9) {

if($ox > $oy) {}
else {}

}

else {обычное сжатие}


-~{}~ 06.09.09 15:50:

help! :)

-~{}~ 06.09.09 23:20:

Может кому пригодится. :)

PHP:
$ox = imagesx($im);
$oy = imagesy($im);


Не забывайте ставить ограничение:

$t = $ox / $oy;
if($t < 0.6) {exit();}

$t6x = ($ox / 140);

if($oy > $ox) {$nm = imagecreatetruecolor(140,100);		
imagecopyresampled($nm, $im,0,0,0,($oy / 4),140,($oy / $t6x),$ox,$oy);}
else {$nm = imagecreatetruecolor(140,100);		
imagecopyresampled($nm, $im,0,0,0,0,140,100,$ox,$oy);}
 

Sawa

Новичок
есть готовые классы для кропа фото, воспользуйся ими.

В классическом варианте надо определить размеры фото, т.к. при сжатии и вырезании фрагмента изображения надо сначала определить параметры, алгоритм будет немного разным для вырезания из высоких, широких и квадратных изображениях. Связано с методом обрезания фото. в нашем случае:
PHP:
$ox = imagesx($im);
$oy = imagesy($im); 
$nm = imagecreatetruecolor(140,100);
$ratio = $ox / $oy;  // смотрим соотношение сторон
$img_x = 140*$ratio; // определяем размеры фрагмента изображения
$img_y = 100/$ratio;  // это необходимо чтобы выбрать пропорциональный фрагмент, и не допустить искажения

$start_position_x = 0;
$start_position_y = 0;
if ($ratio<1) // x меньшая сторона
{  
  $start_position_y = ($oy-$img_y)/2;  // обрезаем по Y если фото слишком высокое
 // тут все манипуляции с высокими фото
} elseif($ratio>1){ // x большая сторона
 // манипуляции с широкими фото
} else {
  $start_position_x = ($ox-$img_x)/2; // у нас должен получится не квадратный результат. обрезаем края если фото квадратное
 // квадратная фото
}

	    imagecopyresampled($nm, $im, 0, 0, 
	    		$start_position_x, 
	    		$start_position_y, 
	    		140, // у нас заданный размер конечной фото, вариантов быть не может
	    		100, 
	    		$img_x, // вырезаем только пропорциональный фрагмент
	    		$img_y);
... или что-то вроде того. сам код представлен для наглядности


ЗЫ. вообще верно заметили, учебник школьный тебе нужен, а не ман по пхп. Нарисуй на бумаге, посмотри как тебе надо работать с изображением. Я намеренно вынес imagecopyresampled из ифов т.к. в там должен быть расчет параметров для функции.
не ленимся, смотрим примеры. на php.net к imagecopyresampled в коментариях функция лежит почти готовая. она кривая и багов куча там, но для базового понимания этого достаточно
 

Beckie

Новичок
Спасибо.
Да чет не сообразил нарисовать всё это дело. А математику чет совсем забыл, но как никак, свой, рабочий скрипт написал. Работает так же, как и написанный вами. :)
Только квадратные озображения еще не пробовал загружать.

Все ведь через это проходят, кому-то дается это легко, кому-то потруднее. :rolleyes:

Я просто не сразу понял, что каждый параметр в функции делает.
 
Сверху