image — PHP: добавление непрозрачности с помощью imagefilter () затемняет прозрачные области

В настоящее время я пишу скрипт для добавления водяных знаков на изображения. Указанные водяные знаки различаются по своей непрозрачности.
Например, базовое изображение водяного знака представляет собой PNG с полностью видимым текстом и прозрачным фоном. Когда я добавлю, я хочу, чтобы этот базовый PNG исчез, чтобы соответствовать моим потребностям и сделать непрозрачный водяной знак.

Для этого я использую imagefilter() исчезать PNG:

$opacity = 0.25;
$watermarkRes = imagecreatefrompng($filename);

imagealphablending($watermarkRes, false);
imagesavealpha($watermarkRes, true);

$transparency = 1 - $opacity;
imagefilter(
$watermarkRes,
IMG_FILTER_COLORIZE,
0,
0,
0,
127*$transparency
);
imagepng($watermarkRes, $filename);

Все непрозрачные области красиво исчезают, но существующие прозрачные области становятся черными.

Это результат вышеприведенного кода:

https://preview.ibb.co/j8zePF/TEST.png

При использовании в качестве водяного знака это выглядит так:

https://preview.ibb.co/mLvKPF/15027295625991d55a1ef081_42502547.jpg

Пока желаемый результат должен быть таким:

https://preview.ibb.co/f81R4F/TEST_15027295625991d55a1ef081_42502547.jpg

Как я могу добиться добавления непрозрачности к тексту при сохранении прозрачных областей, как они есть?

0

Решение

Не берите в голову. Проблема заключалась не в самой функции, а в том, что я заранее изменил высоту водяного знака в соответствии с его использованием.

Я удалил этот код, чтобы изменить размер водяного знака:

$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $watermarkRes, 0, 0, 0, 0, $width, $height, imagesx($watermarkRes), imagesy($watermarkRes));
$watermarkRes = $new_image;

И вместо этого использовал код изменения размера Dycey, предоставленный в ответе на этот вопрос:

Как изменить размер PNG с прозрачностью в PHP?

Для моего случая я создал эту функцию для изменения размера изображений:

/**
* @param int $width
* @param int $height
*/
public function resize($width, $height)
{
$new_image = imagecreatetruecolor($width, $height);

if($this->image_type === IMAGETYPE_PNG || $this->image_type === IMAGETYPE_GIF) {
imagealphablending($new_image, false);
imagesavealpha($new_image,true);
$transparent = imagecolorallocatealpha(
$new_image, 255, 255, 255, 127
);
imagefilledrectangle(
$new_image, 0, 0, $width, $height, $transparent
);
}

imagecopyresampled(
$new_image,
$this->image,
0, 0, 0, 0,
$width, $height,
imagesx($this->image), imagesy($this->image)
);
$this->image = $new_image;
}
0

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

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

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