Как обрезать изображение, используя функции изображения GD - PullRequest
0 голосов
/ 03 сентября 2011

все в моем коде отлично работает для создания миниатюры загруженного изображения.

теперь все, что мне нужно сделать, это обрезать $ thumb из центра изображения в квадратную форму (50x50)

вот мои функции до сих пор

    $ext = end(explode('.', $_FILES['profile_photo']['name']));

    if ($ext == 'jpg' || $ext == 'jpeg' || $ext == 'png' || $ext == 'gif')
    {
        $tmp = $_FILES['profile_photo']['tmp_name'];

        if ($ext=='jpg' || $ext=='jpeg')
            $src = imagecreatefromjpeg($tmp);
        else if ($ext=='png')
            $src = imagecreatefrompng($tmp);
        else 
            $src = imagecreatefromgif($tmp);

        list($width,$height) = getimagesize($tmp);

        $thumb_width = 50;
        $thumb_height = ($height/$width) * $thumb_width;
        $thumb_tmp = imagecreatetruecolor($thumb_width, $thumb_height);

        $full_width = 200;
        $full_height = ($height/$width) * $full_width;
        $full_tmp = imagecreatetruecolor($full_width, $full_height);

        imagecopyresampled($thumb_tmp, $src, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);         
        imagecopyresampled($full_tmp, $src, 0, 0, 0, 0, $full_width, $full_height, $width, $height);        

        imagejpeg($thumb_tmp, 'images/profile/'.$user['id'].'_'.time().'_thumb.'.$ext, 100);
        imagejpeg($full_tmp, 'images/profile/'.$user['id'].'_'.time().'_full.'.$ext, 100);

        imagedestroy($src);
        imagedestroy($thumb_tmp);
        imagedestroy($full_tmp);

        // delete old image from server if it is not none.png
    }

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

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Сразу после $full_tmp = imagecreatetruecolor($full_width, $full_height);, добавить ...

if ($thumb_width > $thumb_height) {
    $thumb_offset = array('x' => ($thumb_width/2 - 25), 'y' => 0);
} else {
    $thumb_offset = array('x' => 0, 'y' => ($thumb_height/2 - 25));
}

$square_tmp = imagecreatetruecolor($thumb_width, $thumb_height);

imagecopyresampled($square_tmp, $src, 0, 0, $thumb_offset['x'], $thumb_offset['y'], 50, 50, $width, $height);

Затем сохраните и уничтожьте темп, как два других изображения.

0 голосов
/ 03 сентября 2011

Посмотрите на параметры, которые должны быть переданы imagecopyresampled, согласно руководству по PHP:

imagecopyresampled ( 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 )

Начиная с третьего параметра, вы в основном определяете, как прямоугольник на исходном изображении отображаетсяк прямоугольнику на целевом изображении.

Итак, первое, что вам нужно сделать, это вычислить прямоугольник (x, y, width и height), который определяет видимую область вашегооригинальное изображение.Это будут 5-й, 6-й, 9-й и 10-й параметры функции соответственно.

Для прямоугольника назначения используйте 0,0 для x,y и $thumb_width,$thumb_height для w,h, как вы это делаете в настоящее время.

...