我有一个图像处理类,我想创建总是填满整个新宽度和高度的图像,所以没有边框/纯色背景,我只是不明白我怎么能使它总是填充高度和宽度(如果图像宽度和高度小于新图像尺寸,则保持上传图像的宽高比。
就像phpthumb类中的zoomcrop(zc = 1)一样(我从它看起来代码,但我无法模仿行为)
public function resizeCrop($newwidth, $newheight) {
...
$x = $this->getX();
$y = $this->getY();
...
else if ($x < $newwidth && $y < $newheight)
{
// logic ??
}
}
答案 0 :(得分:2)
您需要确保较小(相对于原始图像和容器的纵横比)侧缩放到最大值。看看这段代码:
public function resizeCrop($newwidth, $newheight) {
...
$x = $this->getX();
$y = $this->getY();
// old images width will fit
if(($x / $y) < ($newwidth/$newheight)){
$scale = $newwidth/$x;
$newX = 0;
$newY = - ($scale * $y - $newheight) / 2;
// else old image's height will fit
}else{
$scale = $newheight/$y;
$newX = - ($scale * $x - $newwidth) / 2;
$newY = 0;
}
// new image
$dest = imagecreatetruecolor($newwidth, $newheight);
// now use imagecopyresampled
imagecopyresampled($dest, $src, $newX, $newY, 0, 0, $scale * $x, $scale * $y, $x, $y);
return $dest;
}
更新:更正了该功能。它现在工作得很好,我已经在我的开发机器上测试了它。
答案 1 :(得分:1)
要保持宽高比,您需要选择:要么使图像太大,然后裁剪原稿,要么使其恰好合适,然后填写未达到的部分边缘有纯色。
前者,您可以分别比较宽度和高度的百分比变化,然后使用较大的百分比作为两个维度的乘数。对于1 x 1单位图像,您希望适合2w x 3h单位区域并保持纵横比:您可以使用3倍乘数,获得3 x 3单位图像,并向左/右裁剪.5单位。
后者,您使用较小的百分比作为乘数。对于1 x 1单位图像,您希望适合2w x 3h单位区域并保持纵横比:您可以使用2x倍增器,获得2 x 2单位图像,并添加.5单位纯色顶部/底部