如何在保持透明度的同时在 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
每当我在具有透明度的 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