繁体   English   中英

PHP - 水印PNG透明度/ Alpha

[英]PHP - Watermark PNG Transparency/Alpha

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

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

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

以下是此博客中有关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);
?>

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

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

我希望这有助于混乱的水上运动员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM