imagecopyresampled在PHP中,有人可以解释一下吗?

时间:2010-08-30 23:20:31

标签: php image-manipulation gd

好吧,我以为我理解了这个功能,但我对这个功能有一个完整的心理障碍。

我想从800x536的照片中创建尺寸为75x75的裁剪缩略图。

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 个答案:

答案 0 :(得分:18)

这很简单,记录在案here

参数:

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 offset,同上

7)$ dst_x - $ dst_image中新重新采样的图像的X宽度
8)$ dst_y - Y宽度,同上

9)$ src_x - 要复制出$ src_image的区域的X宽度 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,be,f参数。