图像复制在 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,b
和 e,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() 语法的含义吗? [复制]
以下等式在 python x=4**3**5**7 中如何工作。有人可以解释一下它的执行顺序吗? [复制]