Установить цвет фона на альфа-смешанном изображении - PullRequest
0 голосов
/ 15 апреля 2020

При сохранении смешанного изображения в альфа-формате, например:

enter image description here

с использованием imagejpeg () , с кодом ниже, I получить черный фон.

$sourcePath = "<path to the image above>";
$destPath = "<path to where I want to store it>";
$image = imagecreatefrompng($sourcePath);
imagejpeg($image, $destPath, 85);

Я получаю черный квадрат. Это явно не то, что мне нужно, фон должен быть белым.

Я прочитал об альфа-смешивании, попробовал несколько вещей с функциями GD в PHP, но я не смог этого сделать. Возможно, мне следует скопировать изображение в новое изображение перед его сохранением, но я бы предпочел не делать этого.

Мой вопрос: Какой самый простой способ сохранить Приведенное выше изображение с правильным белым фоном с использованием функций PHP GD? На выходе не требуется альфа-смешение, все, что мне нужно, это белый фон.

Бонусный вопрос: Есть ли способ определить, есть ли у изображения альфа-канал

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Вы можете использовать imagealphablending и imagesavealpha для сохранения альфа-канала

$imgPng = imagecreatefrompng($strImagePath);
imagealphablending($imgPng, true);
imageSaveAlpha($imgPng, true);

header("Content-type: image/png");
imagepng($imgPng);

Об альфа-канале вы можете проанализировать пиксель для этого с помощью imagecolorat . Пример анализа альфа в комментариях

0 голосов
/ 15 апреля 2020

Мне удалось сделать это, когда я скопировал изображение с этим кодом:

// start with the same code as in the question
$sourcePath = "<path to the image above>";
$destPath   = "<path to where I want to store it>";
$image      = imagecreatefrompng($sourcePath);
// get image dimensions 
$width      = imagesx($image);
$height     = imagesy($image);
// create a new image with the same dimensions
$newImage   = imagecreatetruecolor($width, $height);
// get white in the new image
$white      = imagecolorallocate($newImage, 255, 255, 255);
// and fill the new image with that
imagefilledrectangle($newImage, 0, 0, $width, $height, $white);
// now copy the alpha blended image over it
imagecopy($newImage, $image, 0, 0, 0, 0, $width, $height);
// and finally the jpeg output
imagejpeg($newImage, $destPath, 85);

Это решает мою проблему, но действительно ли это копирование необходимо?

У меня тоже до сих пор нет способ определить, есть ли на изображении альфа-канал.

...