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

时间:2013-08-07 16:58:42

标签: php gd watermark

我试图在将图片上传到我的网站后立即为图片添加水印,但似乎水印一直是黑色物体而没有细节。我相信脚本有点工作,因为如果它不是,我可能不会看到任何类型的水印或脚本会失败。

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

$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像素:

enter image description here

我尝试过使用水印图像本身。我的第一个尝试是保存photoshop水印(透明bg)使用'保存为网络'并选择了PNG-24'。这不起作用,所以我将其保存为普通的PNG(没有'保存为网络')但它仍然失败。

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

2 个答案:

答案 0 :(得分: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);

有些事情:

  1. imagecopymerge不允许PNG-24的透明度
  2. (资料来源:https://drupal.org/node/80369

    1. imagesavealpha + imagealphablending允许保存透明度
    2. (资料来源:http://php.net/manual/en/function.imagesavealpha.php

      我希望它能解决你的问题。

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

答案 1 :(得分:0)

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 channek(透明度)保存水印。从CS2开始的Photoshop(除了网页)应该做的事情,GIMP也很有用。