博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP的生成图片或文字水印的类
阅读量:6692 次
发布时间:2019-06-25

本文共 7330 字,大约阅读时间需要 24 分钟。

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 right4-middle left  5-middle center  6-middle right7-bottom left  8-bottom center  9-bottom right0-random2、设置具体位置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;?>

转载于:https://www.cnblogs.com/lovellll/p/10200535.html

你可能感兴趣的文章
不一样的Office 365之 —— 使用StaffHub管理你的排班
查看>>
从Mysql EXPLAIN探寻数据库查询优化2
查看>>
让元素居中
查看>>
php memcache保存session的一个设置误区
查看>>
鱼眼镜头
查看>>
Scalatra
查看>>
CentOS 7 三者分离编译安装LAMP
查看>>
Linux内核调整,支持4000-8000并发
查看>>
jquery mobile 设置设备适配
查看>>
redis使用总结-redis命令总结
查看>>
创业浪潮:春天蓬勃而来
查看>>
阿里云Linux安装软件镜像源
查看>>
阿里云对象存储OSS支持版本管理特性
查看>>
用python 访问redis的几种常用方式
查看>>
我的友情链接
查看>>
Linux Shell 基本概念及编程(5)
查看>>
RDBMS DBMS MS DB
查看>>
我的友情链接
查看>>
svn 实践
查看>>
在 PowerShell 中使用 SQL Server (3)
查看>>