PHP GD水印脚本产生空白水印

Posted

技术标签:

【中文标题】PHP GD水印脚本产生空白水印【英文标题】:PHP GD watermark script produces blank watermark 【发布时间】:2013-08-07 16:58:41 【问题描述】:

我正在尝试在将图像上传到我的网站后立即为其添加水印,但水印似乎一直以黑色物体的形式出现,没有任何细节。我相信脚本可以正常工作,因为如果不正常,我可能不会看到任何类型的水印,否则脚本会失败。

到目前为止,这是我的脚本:

$watermark = imagecreatefrompng('preview-watermark.png');  
$watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);        
$image = imagecreatetruecolor($watermark_width, $watermark_height);  
$image = imagecreatefromjpeg($portfolio_preview_dir.'/'.$file);  
$size = getimagesize($portfolio_preview_dir.'/'.$file);  
$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, $portfolio_preview_dir.'/'.$file);  
imagedestroy($image); 
imagedestroy($watermark);

这就是它正在生产的东西。水印的形状是正确的,因为水印是 325x37 像素:

我尝试过使用水印图像本身。我的第一次尝试是使用“保存为网络”并选择“PNG-24”来保存 Photoshop 水印(带有透明背景)。这不起作用,所以我将它保存为普通的 PNG(没有“保存为网络”),但它仍然失败。

我不确定是脚本还是图像!有人可以与我分享一些知识并帮助解决此问题吗?

【问题讨论】:

我记得读过somewhere,PNG-24 存在一些 GD 问题,而 PNG-8 在水印方面会更好。 【参考方案1】:
$watermark = imagecreatefrompng('preview-watermark.png');
imagealphablending($watermark , false);
imagesavealpha($watermark , true);
$watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);        
$image = imagecreatetruecolor($watermark_width, $watermark_height);  
$image = imagecreatefromjpeg($portfolio_preview_dir.'/'.$file);  
$size = getimagesize($portfolio_preview_dir.'/'.$file);  
$dest_x = $size[0] - $watermark_width - 5;  
$dest_y = $size[1] - $watermark_height - 5;  
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);  
imagejpeg($image, $portfolio_preview_dir.'/'.$file);  
imagedestroy($image); 
imagedestroy($watermark);

有些东西:

    imagecopymerge 不允许 PNG-24 透明

(来源:https://drupal.org/node/80369)

    imagesavealpha + imagealphablending 允许保存透明度

(来源:http://php.net/manual/en/function.imagesavealpha.php)

希望它能解决你的问题。

你也输出一个JPEG,为什么?继续使用 PNG,您的图像将支持透明水印,但现在不支持!

【讨论】:

通过实际尝试,我知道你是对的。发布问题后,弹出了一篇相关文章,有人说了同样的话。我刚刚测试了一个 PNG-8 水印,它工作正常,虽然边缘看起来很粗糙。我将尝试将“imagecopymerge”更改为 PNG-24 除外。谢谢。 很高兴听到,我在答案中添加了一些额外的内容,为什么你使用 imagejpeg 而不是 imagepng? 我的用户上传了一个 JPEG 文件,上传脚本将其保存为 JPEG 文件,所以我想我只是想保持它不变。如果我要使用 PNG,我必须在应用程序的其余部分更改相当多的代码。 不,你只需要正常地将 imagejpeg() 更改为 imagepng(),但没关系。那你就不能使用透明度了。 决定网站其余部分的模组(使用 png 代替 jpg)是值得的。我现在已经让脚本工作了。谢谢。【参考方案2】:

在 SO 和 php.net 上也有很多解决方案。这是one(本身不创建新图像)

// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);

编辑

应使用 alpha 通道(透明度)保存水印。 Photoshop 因为 CS2(保存为 Web)应该可以做到这一点,GIMP 也很好用。

【讨论】:

感谢您的宝贵时间,但我并不是真的在寻找新的脚本,我只是想找出发生这种情况的原因并修复我的脚本。 您写了I'm not sure whether it's the script or the image,所以我认为您的脚本(未经进一步分析)无法正常工作。我们无法测试图片是否正常,因为您还没有附加它。

以上是关于PHP GD水印脚本产生空白水印的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP GD 中调整 png 大小时将 jpg 与 png 合并(水印)

php基础 gd图像生成缩放logo水印和验证码

php基础 gd图像生成缩放logo水印和验证码

使用 GD 批量水印图像

如何使用 PHP 和 GD 制作水印图像,如 envato photodune 预览图像?

php基础之gd图像生成缩放logo水印和简单验证码实现