2012-07-27 96 views
5

我知道这已经覆盖的时间很多,但我一直在尝试不同的脚本和修改一个我,和我仍然不能让我的PNG-24 watermark.png是透明在我的父图像的顶部。PHP - 水印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,但仍然没有运气。我在浏览器中加载了水印(原始),它绝对透明,但不在图像上。这当然不会那么困难?任何想法我做错了什么?

回答

14

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

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

下面是从this blog约PNG类型的相关部分:

水印图像应在下列推荐 格式之一:

  • PNG-8(推荐)
    颜色:256或更少
    透明度:开/关
  • GIF
    种颜色:256或更低
    透明度:开/关
  • JPEG
    颜色:真彩色
    透明度:N/A

的imagecopymerge函数不正确处理PNG-24 图像;因此不推荐。

如果您在使用Adobe Photoshop创建水印图像,它是 建议您使用“另存为网页”命令与以下 设置:

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)ading,我发现,您可以使用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水印中获得更好的质量。

我希望这可以帮助那里的困惑水标记。

+1

请不要包含文字的屏幕截图。 – meagar 2012-07-27 17:29:13

+2

@meagar:为什么?如果它太困扰你了,重写它! – TheCarver 2012-07-27 17:31:51

+5

我做过了,但我不应该这样做。不要截图文本。这对网站不利,对网站不利,对用户不利。 – meagar 2012-07-27 17:32:52