php调整大小图像zoomcrop无边框(逻辑)

时间:2011-09-15 18:46:18

标签: php resize gd zoom crop

我有一个图像处理类,我想创建总是填满整个新宽度和高度的图像,所以没有边框/纯色背景,我只是不明白我怎么能使它总是填充高度和宽度(如果图像宽度和高度小于新图像尺寸,则保持上传图像的宽高比

就像phpthumb类中的zoomcrop(zc = 1)一样(我从它看起来代码,但我无法模仿行为)

    public function resizeCrop($newwidth, $newheight) {

                        ...

            $x = $this->getX();
            $y = $this->getY();

            ...

            else if ($x < $newwidth && $y < $newheight)
            {

            // logic ??

            }

    }

2 个答案:

答案 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单位纯色顶部/底部