• 技术文章 >后端开发 >PHP问题

    php png水印不透明怎么办

    藏色散人藏色散人2021-05-11 10:07:56原创464

    php png水印不透明的方法:首先通过“public function water(){...}”给图片添加水印;然后通过“imagecolorallocate($wImage...);”等函数防止png透明背景变黑即可。

    本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑

    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;
            }
        }

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

    如图

    abe9617d65107611026335c8a968926.png

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

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

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

    08ca5329492587350b496c74b999fd4.png

    推荐学习:《PHP视频教程

    以上就是php png水印不透明怎么办的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php png
    上一篇:php不能上传大文件怎么办 下一篇:php怎么取消执行时间限制
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• ldap php怎么修改密码• php将字符串转为utf8的方法• linux 如何确认php安装成功• php结果集怎么转数组• php不能上传大文件怎么办
    1/1

    PHP中文网