imagecopyresampled

BFO

Новичок
imagecopyresampled

Добрый день!
Нигде в наших интернетах не могу найти нормального описания этой функции.

Задача из любого jpg сделать набор превьюшек разных размеров и сохранить их.

Действия мои такие (на примере создания превьюшки 800х600 из 2000x1000):
1. Определяю размеры оригинала
2. определяю горизонтальное или вертикальное изображение
3. (горизонтальное) нахожу ширину если высоту сделать 600 (600*2000/1000)=1200
4. определяю, что надо по оси Х убрать (1200-800)=400/2=200пикс слева и справа.

5. создаю холст 800х600
6. создаю холст с нашим оригиналом (2000х1000)

7. imagecopyresized(???????) или imagecopyresampled()

Методом тыка что-то получилось приближенное, но хотелось бы подробнее про синтаксис этой функции

PHP:
imagecopyresampled($new_canvas,$old_canvas,0,0,200,0,800,600,$x-400;
Картинки как режется, так и немного сжимается (вытягивается)

на сколько я понял:
bool imagecopyresized ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )

resource dst_image - новый холст 800х600
resource src_image - холст с оригинальным изображением
int dst_x - лево холста куда копируем (0)
int dst_y - верх холста куда копируем (0)
int src_x - лево нашего холста (0)
int src_y - верх нашего холста (200)
int dst_w - ширина холста куда копируем (800)
int dst_h - высота холста куда копируем (600)
int src_w - ширина нашего оригинала (800) - сколько пикселей резать по ширине
int src_h - высота нашего оригинала (600) - сколько пикселей резать по высоте с 200 пикселя.

Всё правильно?

Вобщем совсем запутался =(
Спасибо.
 

Фанат

oncle terrible
Команда форума
3. (горизонтальное) нахожу ширину если высоту сделать 600 (600*2000/1000)=1200
что-то я не понял этой пропорции
4. определяю, что надо по оси Х убрать (1200-800)=400/2=200пикс слева и справа.
сделай сначала без "убирания".
 

BFO

Новичок
Автор оригинала: baev
— соотношение сторон оригинала = 2000/1000, значит при высоте 600 ширина будет 600*2000/1000
правильно!

дайте ссылок тогда. Я лично ничего не нашел!

Просто ресайз делал сотню раз (где 2-6 параметр функции 0,0,0,0) это и в офф.документации такой пример есть.

интересует именно вариант:
а) режЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕм. в словае режЕм - буква Е. Слово "режим" - означает совсем другое.
б) из этого делаем квадрат =)
 

Фанат

oncle terrible
Команда форума
дайте ссылок тогда. Я лично ничего не нашел!
учебник математики за 5 класс, планиметрия.

возьми бумажку, ручк4у, и посчитай все нужные размеры.
 

BFO

Новичок
ну собственно один стёб и ничего более....
как я и думал.....
спасибо! помогли сразу!
а вот наверное за $$$ ответите и поможете! ЛС-вас ждёт!

Нельзя так с планометрией... У меня её не было!
 

Фанат

oncle terrible
Команда форума
если не было, то не имеет смысла заниматься и пхп. Математику надо знать.

-~{}~ 04.03.10 00:57:

это кстати, был не стеб.
это нормальная практика. так - с бумажкой - делают все.
сначала разобраться, что ты хочешь, а потом писать программу.
не наоборот
 

Leonid

PHP? нет, не слышал...
Ресайз можно делать по разному. Из вертикального прямоугольника сделать уменьшенный квадрат можно двумя способами:
1. Обрезаем верх и низ, чтобы получился квадрат, уменьшаем до нужного
2. Слева и справа добавляем белые поля (или другого нужного цвета) , чтобы получился квадрат, уменьшаем до нужного

Желательно дать пользователю выбор, как ресайзить, т.к. для разных картинок оптимальны разные способы.

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

PHP:
function resize_image($imgfile,$thumbsdir,$thumb_width, $thumb_height,$resize_type = 'cut')
	{
	// $imgfile исходный файл
//   $thumbsdir директория, куда сохранится уменьшенная копия с таки же именем
// $resize_type = 'cut' | 'whiteborder' - тип ресайза: обреза или добавление белых полей
	$small = $thumbsdir.basename ($imgfile);
	
	list ($image_width, $image_height, $image_type) = @GetImageSize($imgfile);
	switch ($image_type) 
		{
		case 1:	$src_img = ImageCreatefromGif($imgfile); 	$imgtype = 'gif'; break;
		case 2:	$src_img = ImageCreatefromJpeg($imgfile); 	$imgtype = 'jpg'; break;
		case 3:	$src_img = ImageCreatefromPng($imgfile); 	$imgtype = 'png'; break;
		default: return FALSE;
		}
	$p_wh = $thumb_width/$thumb_height; 
	$s_wh = $image_width/$image_height; 
	

	$dst_img_t = ImageCreateTrueColor($thumb_width, $thumb_height);
	$whitecolor = imagecolorallocate($dst_img_t, 255, 255, 255);
	imagefill($dst_img_t, 0, 0, $whitecolor);
	
	if ($resize_type == 'cut')
		{
		
		if ($p_wh > $s_wh)
			{
			$new_sh = intval ($image_width / $p_wh);
			$sdv_y = intval(($image_height-$new_sh)/2);
			ImageCopyResampled($dst_img_t, $src_img, 0, 0, 0, $sdv_y, $thumb_width, $thumb_height, $image_width, $new_sh);
			}
		
		if ($p_wh <= $s_wh) 
			{
			$new_sw = intval ($image_height * $p_wh); 
			$sdv_x = intval(($image_width-$new_sw)/2); 
			ImageCopyResampled($dst_img_t, $src_img, 0, 0, $sdv_x, 0, $thumb_width, $thumb_height, $new_sw, $image_height);
			}
		}
	
	if ($resize_type == 'whiteborder')
		{
		if ($p_wh > $s_wh)
			{
			
			$sdv_x = intval(($thumb_width - ($thumb_height * $s_wh))/2);
			$new_width = $thumb_height * $s_wh;
			
			ImageCopyResampled($dst_img_t, $src_img, $sdv_x, 0, 0, 0, $new_width, $thumb_height, $image_width, $image_height);
			}
		
		if ($p_wh <= $s_wh)
			{
			$sdv_y = intval (($thumb_height - $thumb_width / $s_wh)/2);
			$new_height = intval ($thumb_width / $s_wh);
			ImageCopyResampled($dst_img_t, $src_img, 0, $sdv_y, 0, 0, $thumb_width, $new_height, $image_width, $image_height);
			}
		}

	if ($imgtype == 'jpg') ImageJpeg($dst_img_t, $small,90);
	if ($imgtype == 'png') ImagePng($dst_img_t, $small);
	if ($imgtype == 'gif') ImageGif($dst_img_t, $small);

	ImageDestroy($dst_img_t);
	ImageDestroy($src_img);
	return $small;
	}
 
Сверху