imagecopyresampled в PHP, может кто-нибудь объяснить это?

ОК, я думал, что понял эту функцию, но у меня есть полный ментальный блок на этом.

Я хотел создать обрезанные миниатюры размером 75х75 с фотографий размером 800×536.

функция imagecopyresampled имеет 10 возможных параметров. Я сначала попробовал это:

// Starting point of crop $tlx = floor(($width / 2) - ($new_width / 2)); //finds halfway point of big image and subtracts half of thumb. $tly = floor(($height / 2) - ($new_height / 2)); //gets centre of image to be cropped. imagecopyresampled($tmp_img,$img,0,0,$tlx,$tly,$new_width,$new_height,$orig_width,$orig_height); 

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

поэтому я нашел способ делать то, что хочу, но хочу, чтобы вы объяснили, как он работает.

У меня теперь есть:

 //Create thumbnails. $new_width = 75; //pixels. $new_height = 75; if($width > $height) $biggest_side = $width; else $biggest_side = $height; //The crop size will be half that of the largest side $crop_percent = .5; $crop_width = $biggest_side*$crop_percent; $crop_height = $biggest_side*$crop_percent; $c1 = array("x"=>($width-$crop_width)/2, "y"=>($height-$crop_height)/2); //Create new image with new dimensions to hold thumb $tmp_img = imagecreatetruecolor($new_width,$new_height); //Copy and resample original image into new image. imagecopyresampled($tmp_img,$img,0,0,$c1['x'],$c1['y'],$new_width,$new_height,$crop_width,$crop_height); 

он делает это отлично, уменьшая изображение, а затем вырезая середину, но моя математика не очень резкая, и я думаю, что это определенно, что я не полностью понимаю функцию imagecopyresampled.

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

Alex

Это довольно просто, задокументировано здесь

Параметры:

1) $ dst_image, действительный дескриптор GD, представляющий изображение, которое вы хотите скопировать INTO
2) $ src_image, действительная ручка GD, представляющая изображение, которое вы копируете FROM

3) $ dst_x – X смещение в целевом изображении, которое вы хотите поместить перевыбранное изображение в
4) $ dst_y – Y offset, ditto

5) $ src_x – X смещение в исходном изображении, с которого вы хотите начать копирование
6) $ src_y – Y offset, ditto

7) $ dst_x – X ширина вновь измененного изображения в $ dst_image
8) $ dst_y – Y width, ditto

9) $ src_x – X ширина области для копирования из $ src_image
10) $ src_y – Y width, ditto

Так…

У вас есть $ src_image размером 800×536, а $ dst_image – 75×75

  $width = 800 $new_width = 75 +-----------------------+ +----+ | | | | | | | | $new_height = 75 | | $height = 536 +----+ | | | | +-----------------------+ 

Похоже, вы хотите взять средний кусок исходного изображения и сделать эскиз из этого, не так ли? Этот средний кусок должен представлять половину высоты и ширины исходного изображения, поэтому вы хотите:

 $start_X = floor($width / 4); // 200 $width_Y = floor($height / 4); // 134 200 400 200 +-----------------------+ | | | | 134 |-----+----------+------| | | This part| | 268 |-----+----------+------| | | | | 134 +-----------------------+ $end_x = $start_X + (2 * $start_x) // 3 * $start_x = 600 $end_y = $start_Y + (2 * $start_y) // 3 * $start_y = 402 imagecopyresampled($src, $dst, 0, 0, $startX, $start_y, 75, 75, $end_x, $end_y); abcdefgh 

a, b – начните вставлять новое изображение в левую верхнюю часть изображения цели
c, d – начать сосать пиксели из исходного изображения при 200 134
e, f – сделать уменьшенное изображение 75×75 (заполнить миниатюру)
g, h – прекращение копирования пикселей при 600×402 в исходном изображении

Теперь это предполагает, что вы хотите, чтобы эскиз был полностью заполнен. Если вы хотите, чтобы исходное изображение было сокращено пропорционально (так что он имеет тот же рацион высоты / ширины, что и оригинал, тогда вам нужно будет выполнить некоторую математику для настройки параметров a,b и e,f .