PHP - 水印PNG透明度/ Alpha

时间:2012-07-27 02:39:20

标签: php watermark

我知道这已被覆盖了很多次,但我一直在尝试不同的脚本并修改我的脚本,而仍然无法让我的PNG-24 watermark.png透明我母亲形象的顶部。

这就是我目前的情况:

<?

header('content-type: image/jpeg');

$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);

$image = imagecreatefromjpeg($imageURL);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$size = getimagesize($imageURL);

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

$dest_x = $size[0] - $watermark_width - 5;
$dest_y = $size[1] - $watermark_height - 5;

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);

imagejpeg($image);

imagedestroy($image);
imagedestroy($watermark);

?>

我刚刚阅读了另一个SO问题,其中一个答案建议如果你不添加这两行就不会透明:

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

我添加了它们但仍未添加。我尝试将标题和输出设置为PNG,但仍然没有运气。我在浏览器中加载了水印(原始),它绝对是透明的,但不是在图像上。当然这不是那么难吗?我有什么想法吗?

1 个答案:

答案 0 :(得分:15)

这不是应用程序代码的问题,而是水印图像(PNG)本身。

许多水印示例/教程都说使用PNG-24水印,但根据我刚刚阅读的博客,他们说imagecopymerge不能很好地处理PNG-24文件,因此,使用PNG-8和一些特殊的“Save for Web”设置。我这样做了,现在工作正常。

以下是this blog中有关PNG类型的相关部分:

  

水印图像应采用以下建议之一   格式:

     
      
  • PNG-8(推荐)
        颜色:256或更少
        透明度:开/关
  •   
  • GIF
        颜色:256或更少
        透明度:开/关
  •   
  • JPEG
        颜色:真彩色
        透明度:不适用
  •   
     

imagecopymerge功能无法正确处理PNG-24   图片;因此不推荐。

     

如果您使用Adobe Photoshop创建水印图像,那就是   建议您使用“Save for Web”命令并执行以下操作   设置:

     
File Format: PNG-8, non-interlaced
Color Reduction: Selective, 256 colors
Dithering: Diffusion, 88%
Transparency: On, Matte: None
Transparency Dither: Diffusion Transparency Dither, 100%

对于其他人的好处,这是我的水印代码:

<?
$masterURL = 'mydomain.com/myImage.jpg';

header('content-type: image/jpeg');
$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$image = imagecreatefromjpeg($masterURL);
$size = getimagesize($masterURL);
$dest_x = $size[0] - $watermark_width - 5;
$dest_y = $size[1] - $watermark_height - 5;
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>

在同一篇文章中再读一遍(this comment)之后,我发现您可以使用PNG-24水印但使用imagecopy代替imagecopymerge。您可以替换此行:

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);

这一个:

imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);

imagecopymerge与PNG-8水印一起使用对于“即时”水印非常有用,因为水印文件很小。如果你对'幕后'加水印,那么文件大小并不重要,你可以使用imagecopy从PNG-24水印中获得更好的质量。

我希望这能帮助混乱的水上运动员。