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; 
}