我知道这已被覆盖了很多次,但我一直在尝试不同的脚本并修改我的脚本,而仍然无法让我的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,但仍然没有运气。我在浏览器中加载了水印(原始),它绝对是透明的,但不是在图像上。当然这不是那么难吗?我有什么想法吗?
答案 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水印中获得更好的质量。
我希望这能帮助混乱的水上运动员。