PHP:使用imagefilter()添加不透明度已遮住已经透明的区域
问题描述:
我正在编写一个脚本来为图像添加水印。所述水印在不透明度上有所不同。例如,基本水印图像是具有完全可见文本和透明背景的PNG。添加时,我想淡入此基础PNG以适应我的需要并制作不透明的水印。PHP:使用imagefilter()添加不透明度已遮住已经透明的区域
要做到这一点,我用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);
所有非透明区域得到很好的褪色,但现有的transarent领域得到变黑。
这是上面的代码的结果:
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的调整大小代码:
How do I resize pngs with transparency in 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;
}