5

我知道这已经被覆盖了很多次,但我一直在尝试不同的脚本并修改我拥有的脚本,但我仍然无法让我的 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,但仍然没有运气。我在浏览器中加载了水印(原始),它绝对是透明的,但不是在图像上。这肯定不会那么难吧?任何想法我做错了什么?

4

1 回答 1

17

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

很多水印示例/教程说要使用 PNG-24 水印,但根据我刚刚阅读的博客,他们说imagecopymerge不能很好地处理 PNG-24 文件,因此,使用 PNG-8 和一些特殊的“保存为网络”设置。我这样做了,现在效果很好。

以下是此博客中有关 PNG 类型的相关部分:

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

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

imagecopymerge 函数无法正确处理 PNG-24 图像;因此不建议这样做。

如果您使用 Adob​​e 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);
?>

经过更多阅读(对同一篇文章的评论),我发现您可以使用 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);

使用imagecopymergePNG-8 水印非常适合“动态”水印,因为水印文件很小。如果您在“幕后”添加水印,则文件大小并不重要,您可以从 PNG-24 水印中获得更好的质量,使用imagecopy.

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

于 2012-07-27T03:30:39.453 回答