gpt4 book ai didi

PHP - 水印 PNG 透明度/Alpha

转载 作者:可可西里 更新时间:2023-11-01 13:37:12 26 4
gpt4 key购买 nike

我知道这已经被覆盖了很多次,但我一直在尝试不同的脚本并修改我拥有的脚本,但我仍然无法让我的 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”设置。我这样做了,现在工作正常。

这是来自 this blog 的关于 PNG 类型的相关部分:

The watermark image should be in one of the following recommended formats:

  • PNG-8 (recommended)
    Colors: 256 or less
    Transparency: On/Off
  • GIF
    Colors: 256 or less
    Transparency: On/Off
  • JPEG
    Colors: True color
    Transparency: n/a

The imagecopymerge function does not properly handle the PNG-24 images; it is therefore not recommended.

If you are using Adobe Photoshop to create watermark images, it is recommended that you use "Save for Web" command with the following settings:

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);

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

我希望这对困惑的水印有帮助。

关于PHP - 水印 PNG 透明度/Alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com