zoukankan      html  css  js  c++  java
  • php图片添加水印(水印png图片透明处变黑)

    首先是给图片添加水印,该函数的使用很简单,写的很详细

    /**
         * 为图片添加水印
         * @static public
         * @param string $source 原文件名
         * @param string $water  水印图片
         * @param string $$savename  添加水印后的图片名
         * @param string $alpha  水印的透明度
         * @return void
         */
        public function water($source, $water, $savename=null, $alpha=80 ,$w_pos = 9) {
            //检查文件是否存在
            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); //$wImage
            
              
            //2.上色   //防止png透明背景变黑 
            $color=imagecolorallocate($wImage,255,255,255); 
            //3.设置透明 
            imagecolortransparent($wImage,$color); 
            imagefill($wImage,0,0,$color); 
            
            //设定图像的混色模式
            imagealphablending($wImage, true);
    
            //imageAlphaBlending($wImage, false);
            //imageSaveAlpha($wImage, true);
            //图像位置,默认为右下角右对齐
            //$posY = $sInfo["height"] - $wInfo["height"];
            //$posX = $sInfo["width"] - $wInfo["width"];
    switch($w_pos) {
        case 1:
          $wx = 5;
          $wy = 5;
          break;
        case 2:
          $wx = ($sInfo["width"] - $wInfo["width"]) / 2;
          $wy = 0;
          break;
        case 3:
          $wx = $sInfo["width"] - $wInfo["width"];
          $wy = 0;
          break;
        case 4:
          $wx = 0;
          $wy = ($sInfo["height"] - $wInfo["height"]) / 2;
          break;
        case 5:
          $wx = ($sInfo["width"] - $wInfo["width"]) / 2;
          $wy = ($sInfo["height"] - $wInfo["height"]) / 2;
          break;
        case 6:
          $wx = $sInfo["width"] - $wInfo["width"];
       $wy = ($sInfo["height"] - $wInfo["height"]) / 2;
          break;
        case 7:
          $wx = 0;
          $wy = $sInfo["height"] - $wInfo["height"];
          break;
        case 8:
          $wx = ($sInfo["width"] - $wInfo["width"]) / 2;
          $wy = $sInfo["height"] - $wInfo["height"];
          break;
        case 9:
          $wx = $sInfo["width"] - $wInfo["width"];
          $wy = $sInfo["height"] - $wInfo["height"];
          break;
        case 10:
          $wx = rand(0,($sInfo["width"] - $wInfo["width"]));
          $wy = rand(0,($sInfo["height"] - $wInfo["height"]));
          break;       
        default:
          $wx = $sInfo["width"] - $wInfo["width"];
          $wy = $sInfo["height"] - $wInfo["height"];
          break;
      }
    
    
            //生成混合图像
            imagecopymerge($sImage, $wImage, $wx, $wy, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);
    
            //输出图像
            $ImageFun = 'Image' . $sInfo['type'];
            //如果没有给出保存文件名,默认为原图像名
            if (!$savename) {
                $savename = $source;
                @unlink($source);
            }
            //保存图像
            $ImageFun($sImage, $savename);
            imagedestroy($sImage);
        }

    补充,上面的函数中需要用到下面这个函数

     /**
         * 取得图像信息
         * @static
         * @access public
         * @param string $image 图像文件名
         * @return mixed
         */
    
        static function getImageInfo($img) {
            $imageInfo = getimagesize($img);
            if ($imageInfo !== false) {
                $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
                $imageSize = filesize($img);
                $info = array(
                    "width" => $imageInfo[0],
                    "height" => $imageInfo[1],
                    "type" => $imageType,
                    "size" => $imageSize,
                    "mime" => $imageInfo['mime']
                );
                return $info;
            } else {
                return false;
            }
        }

    后来会遇到这样的问题————当水印有透明底色时,生成的图片背景为黑色;

    如图

    这样就需要对水印图片做一下处理,如下

    //2.上色   //防止png透明背景变黑 
            $color=imagecolorallocate($wImage,255,255,255); 
            //3.设置透明 
            imagecolortransparent($wImage,$color); 
            imagefill($wImage,0,0,$color); 

    这样再进行加水印的操作就可以了

  • 相关阅读:
    java使用io流读取windows文件乱码问题
    java的io字符流关闭和刷新.flush();
    java使用io流实现图片复制
    java8新特性-函数式接口详细讲解及案例
    java8的lambda过滤list遍历集合,排序
    java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。
    详讲KMP算法
    java栈和队列
    请求中文乱码解决
    idea创建servlet步骤
  • 原文地址:https://www.cnblogs.com/tingfengqieyu/p/5883021.html
Copyright © 2011-2022 走看看