如何在保持透明度的同时在 PNG 上使用 PHP GD 图像裁剪?

How can you use PHP GD imagecrop on a PNG whilst maintaining transparency?

每当我在具有透明度的 PNG 上调用 PHP GD 的 imagecrop() 时,它会将透明部分变成黑色而不是保持它。

我最近写了一个函数来缩放透明的 PNG,同时保持透明度(见下文),所以我了解使用 imagecopyresampled 等。

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 研究人员愿意向我传授他们宝贵的知识吗?

据我所知,这里没有什么复杂的,您必须在执行裁剪之前保存 alpha 通道。

$img = imagecreatefrompng("./cover.png");
imagealphablending($img, false);
imagesavealpha($img, true);
$resource = imagecrop($img, ['x' => 0, 'y' => 0, 'width' => 500, 'height' => 500]);

确保你有 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