imagecopyresampled в PHP, кто-то может объяснить это? - PullRequest
3 голосов
/ 31 августа 2010

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

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

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);

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

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

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

//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 (половина самой длинной стороны). извините за напыщенность. надеюсь, мой разум скоро поймет это:)

Алекс

1 Ответ

18 голосов
/ 31 августа 2010

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

Параметры:

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

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

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

7) $ dst_x - ширина X вновь пересчитанного изображения в $ dst_image
8) $ dst_y - ширина Y, то же самое

9) $ src_x - X ширина области для копирования из $ src_image
10) $ src_y - ширина Y, то же самое

Итак ...

У вас есть $ src_image 800x536 и $ dst_image 75x75

       $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);
                               a  b  c        d         e   f   g       h

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...