PHP-水印PNG透明度/Alpha


PHP - Watermark PNG Transparency/Alpha

我知道这已经被报道了很多次,但我一直在尝试不同的脚本并修改我现有的脚本,我仍然无法使我的PNG-24水印.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,但仍然没有成功。我在浏览器中加载了水印(原始),它绝对是透明的,但不是在图像上。这肯定不会那么难吧?你知道我做错了什么吗?

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

很多水印示例/教程都说要使用PNG-24水印,但根据我刚刚读到的一篇博客,他们说imagecopymerge不能很好地处理PNG-24文件,因此,请使用PNG-8和一些特殊的"Save for Web"设置。我做了这个,现在效果很好。

以下是这个博客中关于PNG类型的相关部分:

水印图像应为以下推荐图像之一格式:

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

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

如果您使用Adobe Photoshop创建水印图像建议您将"保存为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);
?>

经过更多的阅读(这是对同一篇文章的评论),我发现你可以使用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水印中获得更好的质量。

我希望这能帮助那些困惑的水印。