小邓博客,一位正在奋斗的PHP开发工程师的学习经历分享!为高效PHP开发而努力奋斗

Thinkphp打水印,设置水印位置

PHP dengwz7788 1620℃ 0评论

最近在用Thinkphp的打水印的功能,发现只能打在左下角。 PHP打水印功还是很容易的,最要是用到


bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
   将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。

水印demo图

水印demo图

我需要把水印打到图片的真中间,查看Thinkphp代码。发现,作者居然是写死了,,我只能做一个修改

/**
* 为图片添加水印
* @static public
* @param string $source 原文件名
* @param string $water 水印图片
* @param string $$savename 添加水印后的图片名
* @param string $postion 水印的具体位置 leftbottom rightbottom lefttop righttop center <新增>
* @param string $alpha 水印的透明度
* @return void
*/
static public function water($source, $water, $savename=null,$postion="center", $alpha=80) {
//检查文件是否存在
if (!file_exists($source) || !file_exists($water))
return false;

//图片信息
$sInfo = self::getImageInfo($source);
$wInfo = self::getImageInfo($water);

//如果图片小于水印图片,不生成图片
if ($sInfo["width"] < $wInfo["width"] || $sInfo['height'] < $wInfo['height']) return false; //建立图像 $sCreateFun = "imagecreatefrom" . $sInfo['type']; $sImage = $sCreateFun($source); $wCreateFun = "imagecreatefrom" . $wInfo['type']; $wImage = $wCreateFun($water); //设定图像的混色模式 imagealphablending($wImage, true); //图像位置,默认为右下角右对齐 $posArr = $this->WaterPostion($postion,$sInfo,$wInfo); //新增

   //生成混合图像
    imagecopymerge($sImage, $wImage, $posArr[0], $posArr[1], 0, 0, $wInfo['width'], $wInfo['height'], $alpha);

   //输出图像
   $ImageFun = 'Image' . $sInfo['type'];
  //如果没有给出保存文件名,默认为原图像名
  if (!$savename) {
     $savename = $source;
     @unlink($source);
   }
 //保存图像
   $ImageFun($sImage, $savename);
      imagedestroy($sImage);
  }

  private function WaterPostion($postion,$sInfo,$wInfo)
  {
     $posY = $sInfo["height"] - $wInfo["height"];
     $posX = $sInfo["width"] - $wInfo["width"];

    switch($postion)
  {
     case "rightbottom":
        return array($posX,$posY);
     break;

     case "leftbottom":
        return array($wInfo["width"],$posY);
     break;

     case "lefttop":
       return array($wInfo["width"],$wInfo["height"]);
     break;

     case "righttop":
        return array($posX,$wInfo["height"]);
     break;

     case "center":
       return array($posX/2,$posY/2);
    break;
   }
}

好像就可以了~

转载请注明:PHP研发工程师_小邓PHP博客 » Thinkphp打水印,设置水印位置

喜欢 (7)or分享 (0)
发表我的评论
取消评论

(Spamcheck Enabled)

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址