简体   繁体   English

如何使用GD图像功能裁剪图像

[英]How to crop image using GD image functions

everything in my code is working great for creating a thumbnail image of an uploaded picture. 我的代码中的所有内容都非常适合创建上传图片的缩略图。

now all i need to do is crop the $thumb from the center of the image into a square shape (50x50) 现在我要做的就是将图像中心的$ thumb裁剪为正方形(50x50)

heres my function so far 到目前为止我的功能

    $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
    }

any help would be greatly appreciated! 任何帮助将不胜感激! i know that it has something to do with imagecopyresampled but i can't figure out the math for the cropping from the center of the image. 我知道这与imagecopyresampled有关,但我无法从图像中心算出裁剪的数学运算。 i want this to be my own function so please dont recommend me using other peoples classes. 我希望这是我自己的功能,所以请不要推荐我使用其他人的课程。

Right after $full_tmp = imagecreatetruecolor($full_width, $full_height); 就在$full_tmp = imagecreatetruecolor($full_width, $full_height); , add... ,添加...

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

Then save and destroy the temp like the other two images. 然后像其他两个图像一样保存并销毁温度。

Take a look at the parameters that should be passed to imagecopyresampled , as per the PHP manual: 查看根据PHP手册应传递给imagecopyresampled的参数:

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 )

From the third parameter on, you basically define how a rectangle on the source image maps to a rectangle on the destination image. 从第三个参数开始,您基本上定义了源图像上的矩形如何映射到目标图像上的矩形。

So the first thing you have to do is calculate the rectanle ( x , y , width and height ) which defines the visible area of your original image. 因此,您要做的第一件事是计算定义原始图像可见区域的矩形( xywidthheight )。 These will be the 5th, 6th, 9th and 10th parameters to the function, respectively. 这些将分别是函数的第5,第6,第9和第10个参数。

For the destination rectangle, use 0,0 for x,y , and $thumb_width,$thumb_height for w,h , just as you are currently doing. 对于目标矩形,用0,0x,y ,和$thumb_width,$thumb_heightw,h ,就像你正在做的事情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM