Почему решение проблемы прозрачности png GD не работает?

У меня есть этот код (упрощенный) на рендеринга PNG:

$this->image = imagecreatefrompng($this->file);
header("Content-Type: {$this->imageInfo['mime']}");
imagepng($this->image);

После того, как я получил черный фон, меня искали некоторые решения, которые не работали. Проще один:

$this->image = imagecreatefrompng($this->file);
imagealphablending($targetImage, false);
imagesavealpha($targetImage, true);
header("Content-Type: {$this->imageInfo['mime']}");
imagepng($this->image);exit();

Люди утверждают, что это работает, но у меня все еще есть черный фон, поэтому я попробовал другой:

$this->image = imagecreatefrompng($this->file);
$targetImage = imagecreatetruecolor($this->imageInfo[0], $this->imageInfo[1]);
imagealphablending($targetImage, false);
$color = imagecolorallocatealpha($targetImage, 0, 0, 0, 127);
imagefill($targetImage, 0, 0, $color);
imagecolortransparent($targetImage, $color);
imagesavealpha($targetImage, true);
imagecopyresampled($targetImage, $this->image, 0, 0, 0, 0, $this->imageInfo[0], $this->imageInfo[1], $this->imageInfo[0], $this->imageInfo[1]);
header("Content-Type: {$this->imageInfo['mime']}");
imagepng($this->image);exit();

Результат одинаков во всех современных браузерах. Как это возможно, любая идея?
Код является частью класса, который работает со всеми типами изображений, и все функции работают правильно.

2

Решение

Похоже, вы хотите отправить png файл как есть, так зачем сначала конвертировать его с помощью GD? Я бы просто использовал readfile() и выведите файл:

header("Content-Type: {$this->imageInfo['mime']}");
readfile($this->file);
exit();

Для других ваших тестов:

Вы хотите вывести $targetImage вместо $this->image в конце концов, иначе ничего сложного не произойдет. Также я думаю, что вам нужно включить альфа смешивание перед imagecopyresampled вместо того, чтобы отключить его, чтобы избежать черных границ.

$this->image = imagecreatefrompng($this->file);
$targetImage = imagecreatetruecolor($this->imageInfo[0], $this->imageInfo[1]);

$color = imagecolorallocatealpha($targetImage, 0, 0, 0, 127);
imagefill($targetImage, 0, 0, $color);
imagecolortransparent($targetImage, $color);
imagealphablending($targetImage, true);
imagecopyresampled($targetImage, $this->image, 0, 0, 0, 0, $this->imageInfo[0], $this->imageInfo[1], $this->imageInfo[0], $this->imageInfo[1]);
header("Content-Type: {$this->imageInfo['mime']}");
imagepng($targetImage);
exit();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]