问题使用GD库将图像裁剪为完美的正方形

时间:2010-07-17 16:37:27

标签: php gd gdlib

我使用的类根据某些选项自动将图像裁剪为正方形。问题是当图像具有一定的宽度和高度时,图像被裁剪,但是在图像的右侧添加了1px的黑色像素列。我认为问题在于用于生成新图像大小的数学...可能当高度和宽度的除法给出十进制数时,则方形不完美并且添加了黑色像素...

任何解决方案?

这就是我调用对象的方式:

$resizeObj = new resize($image_file); // *** 1) Initialise / load image
            $resizeObj -> resizeImage(182, 182, 'crop'); // *** 2) Resize image
            $resizeObj -> saveImage($destination_path, 92); // *** 3) Save image

我正在谈论的课程的一部分:

private function getOptimalCrop($newWidth, $newHeight)
    {

        $heightRatio = $this->height / $newHeight;
        $widthRatio  = $this->width /  $newWidth;

        if ($heightRatio < $widthRatio) {
            $optimalRatio = $heightRatio;
        } else {
            $optimalRatio = $widthRatio;
        }

        $optimalHeight = $this->height / $optimalRatio;
        $optimalWidth  = $this->width  / $optimalRatio;

        return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
    }

    private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
    {
        // *** Find center - this will be used for the crop
        $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
        $cropStartY = 0; // start crop from top

        $crop = $this->imageResized;
        //imagedestroy($this->imageResized);

        // *** Now crop from center to exact requested size
        $this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
        imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
    }

更新

也许改变这个:

$heightRatio = $this->height / $newHeight;
$widthRatio  = $this->width /  $newWidth;

用这个:

$heightRatio = round($this->height / $newHeight);
$widthRatio  = round($this->width /  $newWidth);

1 个答案:

答案 0 :(得分:0)

这一行:

$cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );

看起来很可疑。

如果这是整数除法,那么对于奇数个像素宽的图像,您将得到截断。尝试:

$cropStartX = ( $optimalWidth / 2.0) - ( $newWidth / 2.0 );

确保您的所有算术都使用实数,最好是双精度数,但是在处理它的范围内使用数字应该可以在单精度浮点数中工作。