这是一个生成水印的例子.
<?php
header("Content-type: image/png");
$filename='source.jpg';
$sourceImg=imagecreatefromjpeg($filename);
$waterImg=imagecreatefrompng('Logo.png');
$bg_color = imagecolorat($waterImg,1,1);
imagecolortransparent($waterImg,$bg_color); #图片内某颜色的透明
$sourceX = imagesx($sourceImg);
$sourceY = imagesy($sourceImg);
$waterX = imagesx($waterImg);
$waterY = imagesy($waterImg);
$x = ($sourceX-$waterX)/2;
$y = ($sourceY-$waterY)/2;
imagecopymerge($sourceImg,$waterImg,$x,$y,0,0,$waterX,$waterY,50); #最后一个参数是合并度也就是后面那张图片的透明度.
imagepng($sourceImg);
?>

解决方案 »

  1.   

    给你做以下注释.<?php
    header("Content-type: image/png"); # 设置输出文件头
    $filename='source.jpg'; # 设置源文件地址
    $sourceImg=imagecreatefromjpeg($filename);   # 读取源图像
    $waterImg=imagecreatefrompng('Logo.png');   # 读取水印标志
    $bg_color = imagecolorat($waterImg,1,1);       # 取出标志中需要设为透明的颜色
    imagecolortransparent($waterImg,$bg_color);   # 设置标志中需要透明的颜色
    $sourceX = imagesx($sourceImg); # 取得源图像宽度
    $sourceY = imagesy($sourceImg); # 取得源图像高度
    $waterX = imagesx($waterImg);# 取得标志像宽度
    $waterY = imagesy($waterImg);# 取得标志像高度
    $x = ($sourceX-$waterX)/2;
    $y = ($sourceY-$waterY)/2; #计算中心位置
    imagecopymerge($sourceImg,$waterImg,$x,$y,0,0,$waterX,$waterY,50); #合并图像 合并度设置为50 .100为完全合并.相当于把第二个参数里的图像透明到原来的50/100然后贴到第一个参数的图像里
    imagepng($sourceImg);#输出图像
    ?>
      

  2.   

    这个好像不行
    这是我参照你的代码写的$src = imagecreatefrompng("a.png"); # load 图片
    $width = imagesx($src);
    $height = imagesy($src);
    $dst = imagecreate($width, $height); #创建一个新图片
    $bgcolor = imagecolorallocate($dst,0,0,0);
    imagecolortransparent($dst,$bgcolor);  #抹去背景色
    imagecopymerge($dst,$src,0,0,0,0,$width,$height,80); #合并图片
    imagepng($dst, "b.png"); #写入文件结果背景色是黑色的,郁闷
      

  3.   

    不是不行,而是你没写对.imagecolorallocate($dst,0,0,0);# 你自己设置的背景色为黑色呀.
      

  4.   

    你是将一张黑色的图片和前景图片合并了.背景当然是黑色了.
    imagecolorallocate 是用来消除第二张图片中某一颜色的,相当于镂空,然后面的图像能够被看到.
    是为了实现水印的特殊效果才弄得.
      

  5.   

    你仔细看一下我的代码
    $src   =   imagecreatefrompng("a.png");   #   load   图片
    $width   =   imagesx($src);
    $height   =   imagesy($src);
    $dst   =   imagecreate($width,   $height);   #创建一个新图片
    $bgcolor   =   imagecolorallocate($dst,0,0,0);
    imagecolortransparent($dst,$bgcolor);     #抹去背景色
    #到这里为止是生成一张透明的图片,如果没有下面的一行而直接保存的话是一张完全透明的图片
    #不是生成黑色背景图片
    imagecopymerge($dst,$src,0,0,0,0,$width,$height,80);   #合并图片
    imagepng($dst,   "b.png");   #写入文件 另外,png图片本来有一部分是透明的,不需要镂空的,而且镂空的效果和png图片的透明效果不是一样的
    而且我如果把imagecopymerge改为imagecopy的话是没有问题的,相当于复制了一张图片
      

  6.   


    <?php
    $src = imagecreatefrompng("Logo.png"); # load 图片
    $width = imagesx($src);
    $height = imagesy($src);
    $dst = imagecreate($width,$height);
    imagecolorallocatealpha ($dst,255,255,255,127);
    imagecopymerge($dst,$src,0,0,0,0,$width,$height,20);
    imagepng($dst);
    ?>按手册来看,所有的施行都是没错的.
    但是:<?php
    $src = imagecreatefrompng("Logo.png"); # load 图片
    $width = imagesx($src);
    $height = imagesy($src);
    $dst = imagecreate($width,$height);
    imagecolorallocatealpha($dst,255,0,0,102); # 这里设背景色为102透明度(共127)
    imagecopymerge($dst,$src,0,0,0,0,$width,$height,20); #这条语句会让上面那条失效.
    imagepng($dst);
    ?>
      

  7.   

    www.KingOfCoder.com 纯编程文章网
      

  8.   

    看来像个Bug,我去搜了下.都是背景设为白色了之.
    我刚还试了下读取透明png与其合并也会出现黑色背景的现象.
    Image magick Functions 能可以处理.我去看看……
      

  9.   

    imagecopymerge这个函数好像对png图片支持不是很好
    我用这个函数将一个Png图片覆盖到另外一个图片的时候,本来png图片透明的部分变成黑色了
      

  10.   

    一年前的帖子,我回答一下吧呵呵,在保存之前imagesavealpha就可以了,具体在手册中查imagesavealpha