Всякий раз, когда я вызываю PHP GD imagecrop () для PNG с прозрачностью, он превращает прозрачную часть в черный вместо того, чтобы поддерживать ее.
Недавно я написал функцию для масштабирования прозрачных 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;
}
Эта функция выше работает нормально, но когда я также пытаюсь сделать imagecrop () на том же PNG, это когда я получаю черный фон.
Есть ли простой способ успешно выполнить эту культуру? Кажется, я не могу найти хороших примеров.
Я бы предпочел не писать другую сложную функцию, подобную приведенной выше, чтобы обрезать изображение, используя x, y, w, h и imagecopyresampled (), если это возможно, так как это большая боль в мяче.
Есть ли какие-нибудь GD boffins там, чтобы передать свои ценные знания на меня?
Насколько я понимаю, здесь нет ничего сложного, вы должны сохранить альфа-каналы перед выполнением кадрирования.
$img = imagecreatefrompng("./cover.png");
imagealphablending($img, false);
imagesavealpha($img, true);
$resource = imagecrop($img, ['x' => 0, 'y' => 0, 'width' => 500, 'height' => 500]);
Других решений пока нет …