• PHP的生成图片或文字水印的类



    ImageWatermark.php

    
    <?php
    /***********************************************************
    类名:ImageWatermark
    功能:用于生成图片或文字水印
    WDPHP素材源码 http://www.wdphp.com
    ************************************************************
    合成水印:
    1、图像水印appendImageMark(暂不可旋转)
    2、文字水印appendTextMark(汉字水印需要设置汉字字体)(可旋转)
    输出水印图像:write($filename=null)
    1、输出到文件:指定$filename参数为输出的文件名。
    2、输出到浏览器:不指定输出文件名,则输出到浏览器.
    指定水印位置:
    1、指定位置类型$markPosType:(default-0)
    1-top left     2-top center     3-top right
    4-middle left  5-middle center  6-middle right
    7-bottom left  8-bottom center  9-bottom right
    0-random
    2、设置具体位置setMarkPos($x,$y),若指定具体位置,则上面的位置类型无效。
    ************************************************************
    */
    class ImageWatermark {
        public $markPosType = 0; //水印位置,缺省为随机位置输出水印
        public $fontFile = 'arial.ttf'; //字体文件名
        public $color = '#CCCCCC'; //水印字体的颜色
        public $fontSize = 12; //水印字体大小
        public $angle = 0; //水印文字旋转的角度
        private $markPos = array();
        private $markImageFile = null, $destImageFile = null;
        private $mark_res = null, $mark_width = 0, $mark_height = 0, $mark_type = null;
        private $dest_res = null, $dest_width = 0, $dest_height = 0, $dest_type = null;
        //用目标图片作为构造函数的参数
        public function __construct($destImage) {
            if (!file_exists($destImage)) return false;
            $this->destImageFile = $destImage;
            //获取图片大小、类型
            $imageInfo = getimagesize($this->destImageFile);
            $this->dest_width = $imageInfo[0];
            $this->dest_height = $imageInfo[1];
            $this->dest_type = $imageInfo[2];
            //得到图片资源句柄
            $this->dest_res = $this->getImageResource($this->destImageFile, $this->dest_type);
        }
        public function __destruct() {
            imagedestroy($this->dest_res);
        }
        //添加文字水印
        public function appendTextMark($markText) {
            if ($markText == null) return false;
            //计算水印文本的大小
            $box = imagettfbbox($this->fontSize, $this->angle, $this->fontFile, $markText);
            $this->mark_width = $box[2] - $box[6];
            $this->mark_height = $box[3] - $box[7];
            //计算水印位置
            $pos = ($this->markPos != null) ? $this->markPos : $this->getMarkPosition($this->markPosType);
            $pos[1]+= $this->mark_height;
            //将文字打印到图片上
            $RGB = $this->colorHexRgb($this->color);
            $imageColor = imagecolorallocate($this->dest_res, $RGB[0], $RGB[1], $RGB[2]);
            imagettftext($this->dest_res, $this->fontSize, $this->angle, $pos[0], $pos[1], $imageColor, $this->fontFile, $markText);
        }
        //添加图片水印
        public function appendImageMark($markImage) {
            if (!file_exists($markImage)) return false;
            $this->markImageFile = $markImage;
            //获取水印图片大小、类型
            $imageInfo = getimagesize($this->markImageFile);
            $this->mark_width = $imageInfo[0];
            $this->mark_height = $imageInfo[1];
            $this->mark_type = $imageInfo[2];
            //得到图片资源句柄
            $this->mark_res = $this->getImageResource($this->markImageFile, $this->mark_type);
            //计算水印位置
            $pos = ($this->markPos != null) ? $this->markPos : $this->getMarkPosition($this->markPosType);
            //设置图像混色模式
            imagealphablending($this->dest_res, true);
            //复制叠加图像
            imagecopy($this->dest_res, $this->mark_res, $pos[0], $pos[1], 0, 0, $this->mark_width, $this->mark_height);
            imagedestroy($this->mark_res);
        }
        //将叠加水印后的图片写入指定文件,若不定文件名,则输出到浏览器
        public function write($filename = null) {
            $this->writeImage($this->dest_res, $filename, $this->dest_type);
        }
        //设置水印x,y坐标
        public function setMarkPos($x, $y) {
            $this->markPos[0] = $x;
            $this->markPos[1] = $y;
        }
        //将十六进制的颜色值分解成RGB形式
        private function colorHexRgb($color) {
            $color = preg_replace('/#/', '', $color);
            $R = hexdec($color[0] . $color[1]);
            $G = hexdec($color[2] . $color[3]);
            $B = hexdec($color[4] . $color[5]);
            return array(
                $R,
                $G,
                $B
            );
        }
        //计算水印位置
        private function getMarkPosition($type = 0) {
            switch ($type) {
                case 0:
                    $x = rand(0, $this->dest_width - $this->mark_width);
                    $y = rand(0, $this->dest_height - $this->mark_height);
                    break; //random
                    
                case 1:
                    $x = 0;
                    $y = 0;
                    break; //topleft
                    
                case 2:
                    $x = ($this->dest_width - $this->mark_width) / 2;
                    $y = 0;
                    break; //topcenter
                    
                case 3:
                    $x = $this->dest_width - $this->mark_width;
                    $y = 0;
                    break; // topright
                    
                case 4:
                    $x = 0;
                    $y = ($this->dest_height - $this->mark_height) / 2;
                    break; //middleleft
                    
                case 5:
                    $x = ($this->dest_width - $this->mark_width) / 2;
                    $y = ($this->dest_height - $this->mark_height) / 2;
                    break; //middlecenter
                    
                case 6:
                    $x = $this->dest_width - $this->mark_width;
                    $y = ($this->dest_height - $this->mark_height) / 2;
                    break; //middleright
                    
                case 7:
                    $x = 0;
                    $y = $this->dest_height - $this->mark_height;
                    break; //bottomleft
                    
                case 8:
                    $x = ($this->dest_width - $this->mark_width) / 2;
                    $y = $this->dest_height - $this->mark_height;
                    break; //bottomcenter
                    
                case 9:
                    $x = $this->dest_width - $this->mark_width;
                    $y = $this->dest_height - $this->mark_height;
                    break; //bottomright
                    
                default:
                    $x = rand(0, $this->dest_width - $this->mark_width);
                    $y = rand(0, $this->dest_height - $this->mark_height);
                    break; //random
                    
            }
            return array(
                $x,
                $y
            );
        }
        //从一个图像文件中取得图片资源标识符
        private function getImageResource($filename, $type = 0) {
            switch ($type) {
                case 1:
                    return imagecreatefromgif($filename);
                    break;
    
                case 2:
                    return imagecreatefromjpeg($filename);
                    break;
    
                case 3:
                    return imagecreatefrompng($filename);
                    break;
                    // 以后可添加其它格式
                    
                default:
                    return null;
            }
        }
        //将图像写入文件或输出到浏览器
        private function writeImage($ImageRes, $filename = null, $type = 0) {
            switch ($type) {
                case 1:
                    imagegif($ImageRes, $filename);
                    break;
    
                case 2:
                    imagejpeg($ImageRes, $filename);
                    break;
    
                case 3:
                    imagepng($ImageRes, $filename);
                    break;
    
                default:
                    return null;
            }
            return true;
        }
    }
    //使用示例
    $markimg = new ImageWatermark('c_si.jpg');
    //$markimg->setMarkPos(100,200);//如何设置setMarkPos,则markPosType无效。
    $markimg->markPosType = 5;
    $markimg->appendImageMark('mark.png');
    $markimg->fontFile = 'STCAIYUN.TTF';
    $markimg->color = '#FFFFFF';
    $markimg->fontSize = 24;
    $markimg->angle = 45; //设置角度时,注意水印可能旋转出目标图片之外。
    $markimg->appendTextMark('汉字水印');
    $markimg->write();
    $markimg = null;
    ?>
    
    
  • 相关阅读:
    Web前端性能优化-资源合并与压缩
    关于 ES5 & ES6 数组遍历的方法
    代码优化
    解决 Vue 刷新页面后 store 数据丢失的问题
    Lombok
    Dao 与 Dto
    物理删除与逻辑删除的区别
    Java 创建对象的几种方式
    SSM + SpringBoot 常用注解
    Json Web Token (JWT)
  • 原文地址:https://www.cnblogs.com/lovellll/p/10200535.html
Copyright © 2020-2023  润新知