cutFromCenter功能

时间:2016-07-11 13:31:42

标签: php image

我正在关注this code裁剪并调整图片大小。但是,当我使用 cutFromCenter 功能时,它会自动用黑色填充图像,我想用白色填充它。

public function cutFromCenter($width, $height) {

    if ($width < $this->getWidth() && $width > $height) {
        $this->resizeToWidth($width);
    }
    if ($height < $this->getHeight() && $width < $height) {
        $this->resizeToHeight($height);
    }

    $x = ($this->getWidth() / 2) - ($width / 2);
    $y = ($this->getHeight() / 2) - ($height / 2);

    return $this->cut($x, $y, $width, $height);
}

用法:

$resizeimage->load('img/ori.jpg');
$resizeimage->cutFromCenter(320,250);
$resizeimage->save('img/new.jpg');

以任何方式使功能用白色填充小图像?

这是输出:

example

4 个答案:

答案 0 :(得分:1)

在原始图像调整大小之前,尝试使用白色填充用imagecreatetruecolor创建的图像是值得的。

public function cut($x, $y, $width, $height) {
    $new_image = imagecreatetruecolor($width, $height); 

    imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0));
    imagealphablending($new_image, false);
    imagesavealpha($new_image, true);

    $image = imagecreatetruecolor(100, 100);

    $white = imagecolorallocate($new_image, 255, 255, 255);
    imagefill($new_image, 0, 0, $white);

    imagecopy($new_image, $this->image, 0, 0, $x, $y, $width, $height);

    $this->image = $new_image;
}

看看这是否有所不同。

答案 1 :(得分:1)

好的,所以大约20分钟后摆弄我发现你的问题并修复它我也分叉了文件,所以你可以从GitHub链接下载我的版本。

https://gist.github.com/barkermn01/a0ff9dd928ea78443259f8c055f608ac

我对此做了什么。

public function cut($x, $y, $width, $height, $bgColor = null) {
    $new_image = imagecreatetruecolor($width, $height); 
    imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0));
    imagealphablending($new_image, false);
    imagesavealpha($new_image, false);

    if($bgColor != null){
        $rgb = explode(',', $bgColor);
        $color = imagecolorallocate($new_image, $rgb[0], $rgb[1], $rgb[2]);
        imagefill($new_image, 0, 0, $color);
    }
    ob_start (); 
    imagepng($this->image);
    $imageStr = ob_get_clean(); 
    $src_size = getimagesizefromstring($imageStr);
    imagecopyresampled (
        $new_image, 
        $this->image, 
        ($width-$src_size[0])/2,
        ($height-$src_size[1])/2,
        0, 
        0, 
        $src_size[0], 
        $src_size[1],
        $src_size[0], 
        $src_size[1]);
    $this->image = $new_image;
}

<强>说明: 因此,更改剪切方法以使用图像重新样本复制。 通过创建图像然后将其保存到缓冲区并使用该缓冲区获取大小来获取源图像的​​信息。 添加了对RGB颜色刺的支持,以防任何人想要背景颜色不同。

public function cutFromCenter($width, $height, $bgColor = null) {

    if ($width < $this->getWidth() && $width > $height) {
        $this->resizeToWidth($width);
    }
    if ($height < $this->getHeight() && $width < $height) {
        $this->resizeToHeight($height);
    }

    $x = ($this->getWidth() / 2) - ($width / 2);
    $y = ($this->getHeight() / 2) - ($height / 2);

    return $this->cut($x, $y, $width, $height, $bgColor);
}

<强>解释 添加了对通过null传递的背景颜色RGB String的支持,它将默认为GD的默认值。

用法更改为:

$resizeimage->cutFromCenter(320,250, "255,255,255");

允许传递RGB颜色字符串。在这种情况下是白色。

示例:

Original Image Resamapled image cut from centre

答案 2 :(得分:0)

这是因为图像最初是使用透明填充创建的。您需要在剪切方法中修改line 137以将原始图像背景设置为白色。即。

imagecolortransparent($new_image, imagecolorallocate($new_image, 255, 255,255));

答案 3 :(得分:0)

您正在使用的库将每个新图像资源的背景设置为黑色 例如 - 检查resize functioncut function。您可以在两个函数中看到这一点:

imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0));
  

默认情况下 - 新图像的背景颜色配置为已分配的第一个颜色,并且因为这些函数内部有一个调用imagecolorallocate($new_image, 0, 0, 0) - 背景颜色被配置为黑色。

由于您将图片保存为JPEG,并且jpeg格式不支持透明度 - 您的背景将为黑色。

如果您真的想要,可以从以下位置更改该库中的所有代码:

imagecolorallocate($new_image, 0, 0, 0)

要:

imagecolorallocate($new_image, 255, 255, 255)

这会将库创建的所有新图像的背景更改为白色。