图像复制在 PHP 中重新采样,有人可以解释一下吗?

Posted

技术标签:

【中文标题】图像复制在 PHP 中重新采样,有人可以解释一下吗?【英文标题】:imagecopyresampled in PHP, can someone explain it? 【发布时间】:2010-08-30 23:20:31 【问题描述】:

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

我想从 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】:

这相当简单,记录在案的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 偏移量,同上

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

9) $src_x - 从 $src_image 复制出来的区域的 X 宽度 10) $src_y - Y 宽度,同上

所以...

你有一个 800x536 的 $src_image 和一个 75x75 的 $dst_image

       $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 参数。

【讨论】:

哇,非常感谢。图纸使它更容易理解!也这么快。所以,你使用 end_x 和 end_y 参数作为停止坐标,当手册(我看了很多)说它是源图像的宽度和高度时。这和你说的完全不同。现在,我现在正在使用的东西,在 end_x 和 end_y 中有 400x400。那么这是否意味着它从中心切出 400x400,然后将其缩小为 75x75? 当它为 end_x/end_y 显示“源图像”时,它是您要使用的源图像的 PIECE 的结尾。如果要缩小整个图像,则它是原始图像的高度/宽度。否则,它只是您要切片的块的高度/宽度。 对,所以我只是将整个图像的 400 x 400 块缩小,然后取中间的 75x75 正方形?我想我明白了。嘘! 不,您正在复制原始图像的 400x268 块,将副本缩小到 75x75 并将其粘贴到目标图像中,而目标图像恰好是 75x75。 但是通过使高度 = 最大边 * 裁剪百分比以及宽度,它是 400 x 400。我认为按照你的方式它会这样做,但看看我的数字它是 400x400。如果我按照你的方式做,urs 是一个矩形,所以它会被压缩成 75x75

以上是关于图像复制在 PHP 中重新采样,有人可以解释一下吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释一下 C 中 signal() 语法的含义吗? [复制]

有人可以为我解释一下 C++ 代码吗? [复制]

以下等式在 python x=4**3**5**7 中如何工作。有人可以解释一下它的执行顺序吗? [复制]

有人可以解释一下啥是受保护的覆盖无效吗? [复制]

我是 python 新手,我偶然发现了一个函数/变量?我不知道它是做啥的,有人可以解释一下吗? [复制]

有人可以在这里解释冒号的功能吗? [复制]