У меня есть этот код (упрощенный) на рендеринга 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();
Результат одинаков во всех современных браузерах. Как это возможно, любая идея?
Код является частью класса, который работает со всеми типами изображений, и все функции работают правильно.
Похоже, вы хотите отправить 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();
Других решений пока нет …