如何在保持透明度的情况下使用PHP GD图像裁剪PNG?

3
每当我使用PHP GD的imagecrop()函数处理带透明度的PNG图片时,它会把透明部分变成黑色而不是保持原样。
最近我写了一个函数来缩放带透明度的PNG图片并保持其透明度(见下文),因此我知道如何使用imagecopyresampled等功能。请注意保留HTML标签。
function scale_png($image, $resize_w = FALSE, $resize_h = FALSE, $alpha = 127)
{
    $src_w = imagesx($image);
    $src_h = imagesy($image);
    if (! $resize_w) {$resize_w = $src_w;}
    if (! $resize_h) {$resize_h = $src_h;}
    $output = imagecreatetruecolor($resize_w, $resize_h);
    imagealphablending($output, FALSE);
    imagesavealpha($output, TRUE);
    $transparent = imagecolorallocatealpha($output, 255, 255, 255, $alpha);
    imagefilledrectangle($output, 0, 0, $resize_w, $resize_h, $transparent);
    imagecopyresampled($output, $image, 0, 0, 0, 0, $resize_w, $resize_h, $src_w, $src_h);

    return $output;
}

上述函数运行良好,但当我尝试在同一PNG图像上执行imagecrop()时,就会出现黑色背景。

有没有简单的方法可以成功地进行裁剪?我似乎找不到任何好的例子。

如果可能的话,我宁愿不编写另一个复杂的函数来使用x、y、w、h和imagecopyresampled()裁剪图像,因为那太麻烦了。

有没有GD高手能够传授他们宝贵的知识给我呢?


1
@cmorrissey 我的问题是是否有一种方法可以在不编写函数的情况下实现这个功能,如果没有的话,那么这个函数可能是什么样子的。但是谢谢你完全无用的评论和点踩,当事实上这是一个合理的问题。 - undefined
我们不在这里为您编写代码,如果您的代码有错误,我们可以提供帮助。您有一个调整大小函数的示例,将其修改为裁剪图像是很简单的,您也可以通过谷歌搜索获得100个不同的资源。 - undefined
1
@cmorrissey 显然对我来说并不容易,否则我早就完成了...可能比我写这个帖子花的时间还要少。 - undefined
2个回答

0
我理解的方式是这里没有什么复杂的,你必须在进行裁剪之前保存 alpha 通道。
$img = imagecreatefrompng("./cover.png");
imagealphablending($img, false);
imagesavealpha($img, true);
$resource = imagecrop($img, ['x' => 0, 'y' => 0, 'width' => 500, 'height' => 500]);

0

确保您已经安装了GD库。 然后执行以下操作:

   $img = imagecreatefrompng("./sample.png");
    imagealphablending($img, false);//set alphablending to false
    $img=imagecrop($img, array('x' => 0, 'y' =>0, 'width' => 200, 'height' => 200));
    imagesavealpha($img, true);//save alpha after croping

1
这个回答并没有提供任何新的信息,与之前发布的回答相同。 - undefined
在使用imagecrop()函数后,执行imagesavealpha($img, true)可以保存图像的透明度。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接