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