/*给图片加文字水印的方法*/
$dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg';//保证路径正确
$dst = imagecreatefromstring(file_get_contents($dst_path));
/*imagecreatefromstring()--从字符串中的图像流新建一个图像,返回一个图像标示符,其表达了从给定字符串得来的图像
图像格式将自动监测,只要php支持jpeg,png,gif,wbmp,gd2.*/

$font = 'C://test.ttc';//保证路径正确

$black = imagecolorallocate($dst, 0, 0, 0);
imagefttext($dst, 20, 0, 100, 300, $black, $font, 'Hello wor123123123123123123123123123ldwor123123123123123123123123123ldwor123123123123123123123123123ldwor123123123123123123123123123ld!');
/*imagefttext($img,$size,$angle,$x,$y,$color,$fontfile,$text)
$img由图像创建函数返回的图像资源
size要使用的水印的字体大小
angle(角度)文字的倾斜角度,如果是0度代表文字从左往右,如果是90度代表从上往下
x,y水印文字的第一个文字的起始位置
color是水印文字的颜色
fontfile,你希望使用truetype字体的路径*/
list($dst_w,$dst_h,$dst_type) = getimagesize($dst_path);
/*list(mixed $varname[,mixed $......])--把数组中的值赋给一些变量
像array()一样,这不是真正的函数,而是语言结构,List()用一步操作给一组变量进行赋值*/
/*getimagesize()能获取到什么信息?
getimagesize函数会返回图像的所有信息,包括大小,类型等等*/
switch($dst_type){
case 1://GIF
header("content-type:image/gif");
imagegif($dst);
break;
case 2://JPG
header("content-type:image/jpeg");
imagejpeg($dst);
break;
case 3://PNG
header("content-type:image/png");
imagepng($dst);
break;
default:
break;
/*imagepng--以PNG格式将图像输出到浏览器或文件
imagepng()将GD图像流(image)以png格式输出到标注输出(通常为浏览器),或者如果用filename给出了文件名则将其输出到文件*/
}
imagedestroy($dst);

 

  • 下面都是摘抄的
  • 因为一开始,“大家”都说一般任务中,用php操作图片不常见,像我们这种基本业务型的,就更用不到了,所以先别看,偶就没有看。现在有机会了自然要来玩一把。
    以前学过C#的GDI+,交了课程设计后忘得一干二净。又被迫学了点​​MFC​​的画图,觉得这是最蛋疼的画图过程。去年做了个小任务时用到了js图表控件,用的是封装好的js库直接调方法,然后发现这是用HTML5的canvas元素结合js打造而成,这些chart控件很多很漂亮:jsChart、HighChart、EChart、aChart、Chart.js等等,都是基于canvas,还有svg这货也很强大。
    对比下有不少共同点,首先都要创建一个环境(context),就像真实的人画画一样,得给他一个完整的环境:一间画室,一张画板,若干画笔、颜料等,这样的硬性条件具备后才能开始作图,这个环境听起来很抽象,简单理解就是机子上必须具备某些“库”、“扩展”,类似于.net framework、jave runtime等,画js图表你得下载和加载对应的js文件,你的​​浏览器​​得支持canvas,这些硬性条件构成了这个(底层)环境,某些任务需要这些底层去完成,就像玩游戏,很多大点的游戏必须要directX,也是这个道理。
    然后就是调用这个环境提供的各种库的方法,来画各种图形:点、线、圆(弧)、椭圆、矩形、多边形、字符、文本等,再强大的可能直接提供了一些经典的曲线如贝塞尔等,然后可以设置这些图形的样式,线条连续还是断续,颜色红还是绿,画图形时是画个空框架还是将内部填充,画在界面上哪里(图在屏幕上坐标多少),正着放还是歇着放(角度多少),图形长宽如何等等,都应有方法可调。
    等一切设置完毕就是画到界面上了,然后可能会做释放某些资源的扫尾工作(垃圾回收)。大多数工作都在设置各种参数的阶段。
    php使用GD库进行绘图,请确保开启了这个扩展。可以看到当前GD库的版本,支持的类型GIF、JPEG、PNG、WBMP等,FreeType大致查了下是一个字体引擎,提供访问各种字体接口,可供我们绘制文字,也算一个库扩展,只是包含在gd库中。
  • php 图片加水印文字水印_php

  • php画图也基本遵循这个过程:创建画布(相当于绘图环境)->设置参数,绘制图像 -> 输出(保存)图像 -> 资源释放。如果是将图片直接输出到浏览器,实际是放在一个img标签中,它的src属性是这个脚本的所在路径。一个最简单的示例

    ​view source​​​​print​​​​?​
    ​01.​​​​<?php​​​​02.​​​​    ​​​​// 创建画布​​​​03.​​​​    ​​​​$width = ​​​​200​​​​;   ​​​​// 规定画布的宽高​​​​04.​​​​    ​​​​$height = ​​​​100​​​​;​​​​05.​​​​    ​​​​$image = imagecreatetruecolor($width, $height);  ​​​​// 创建一幅真彩色图像​​​​06.​​​​    ​​​​// 添加一些即将用到的颜色​​​​07.​​​​    ​​​​$white = imagecolorallocate($image, ​​​​0xf2​​​​, ​​​​0xec​​​​, ​​​​0xe0​​​​);​​​​08.​​​​    ​​​​$orange = imagecolorallocate($image, ​​​​0xff​​​​, ​​​​0xa5​​​​, ​​​​0x4c​​​​);​​​​09.​​​​    ​​​​// 对画布背景填充颜色​​​​10.​​​​    ​​​​imagefill($image, ​​​​0​​​​, ​​​​0​​​​, $white);​​​​11.​​​​    ​​​​// 画一串字符串在画布上​​​​12.​​​​    ​​​​imagestring($image, ​​​​5​​​​, ​​​​30​​​​, ​​​​40​​​​, ​​​​"Hello World"​​​​, $orange);​​​​13.​​​​    ​​​​// 通知<a href="http://www.it165.net/edu/ewl/" target="_blank" >浏览器</a>输出的是图像(png类型)​​​​14.​​​​    ​​​​header(​​​​'Content-Type: image/png'​​​​);​​​​15.​​​​    ​​​​// 输出到浏览器​​​​16.​​​​    ​​​​imagepng($image);​​​​17.​​​​    ​​​​// 释放图像资源​​​​18.​​​​    ​​​​imagedestroy($image);​
    运行结果与审查元素,src是脚本访问链接,图片实际是放在img标签中。
  • php 图片加水印文字水印_宽高_02

  •     
  • php 图片加水印文字水印_宽高_03

  • 1. 创建画布
    在php中有三种方式,一是imagecreate方法,一是imagecreatetruecolor,这两者不依赖已有文件,创建一幅画布,参数需要制定画布的宽高(如示例),返回一个resource资源型变量,有的称为句柄,以后的操作都在这个资源型变量上进行,它就代表这这幅图像,imagesx和imagesy方法可分别获取到它的宽高属性。稍不同的是,imagecreate方法会在添加颜色时,将第一种添加的颜色(调用imagecolorallocate方法)作为整个画布的背景色,而后者则需要调用方法对背景指定一个添加好的颜色进行填充。还有一类方法是基于现有的文件来创建画布,如imagecreatefromjpeg方法,从一个现有的jpeg(jpg)格式图片创建画布,参数需要你传入该格式文件所在的路径,所以它的代码可以简单到这样

    ​view source​​​​print​​​​?​
    ​1.​​​​<?php​​​​2.​​​​    ​​​​$filename = ​​​​'H:\wampserver\wamp\www\html\image\2015.png'​​​​;  ​​​​// 一个有效的文件路径​​​​3.​​​​    ​​​​$image = imagecreatefrompng($filename);  ​​​​// 从现有文件创建图像​​​​4.​​​​    ​​​​header(​​​​'Content-Type: image/png'​​​​);​​​​5.​​​​    ​​​​imagepng($image);                        ​​​​// 输出图像到浏览器​​​​6.​​​​    ​​​​imagedestroy($image);                    ​​​​// 释放资源​
    2. 设置颜色各项参数
    GD库绘图时颜色是被分配(allocate)到画布环境中的,不是你想画个啥,临时给个颜色变量就行,调用的是imagecolorallocate方法,原型是
    int imagecolorallocate ( resource​​$image​​ , int ​​$red​​ , int ​​$green​​ , int ​​$blue​​ ),第一个参数是前面创建的图像资源变量,后三个一次是红绿蓝色值,采用RGB三原色佳色法原理,绘制真彩色图像,每一个范围是0~255,当RGB=(255, 255, 255),就是白色,很多地方喜欢用十六进制表示,比如CSS中常见#ffffff(大小写均可),所以R、G、B可分别给值0xff、0xff、0xff,每allocate一次分配一种。看看imagecolorallocate函数原型,你会发现它返回的是int型,所以推测它只是对传入的rgb值合成一个颜色后返回一个编号,rgb真彩色是65535种颜色,这样可以每个颜色对应一个数值编号,最好当然还是用变量,凭空写个颜色数值恐怕很难。
    使用imagecreate创建画布时,会将第一种分配的颜色作为画布的背景色(如前),如果是imagecreatetruecolor,则需调用imagefill来填充背景色,方法原型:bool imagefill ( resource​​$image​​ , int ​​$x​​ , int ​​$y​​ , int ​​$color​​ ),它会将$x和$y附近的点填充为$color颜色,所以使用imagefill的话,基本上要么将背景全部填充为一种颜色,要么不填充(默认黑色)。但是一张画布上作画时,也许你需要背景色,但很可能不会将整张画板都涂上一种背景色,旁边总得留点白纸的地方,所以GD库提供了能将背景填充成各种具体形状的方法,如矩形(imagefilledrectangle)、椭圆(imagefilledecllipse)、圆形(椭圆)或扇形(imagefilledarc)、任意多边形(imagefilledpolygon)等,以椭圆形为例,方法原型:bool imagefilledellipse($image, $cx, $cy, $width, $height, $color),第一个参数资源变量,第二、三个椭圆圆心坐标,四、五设置椭圆宽高度,最后是颜色,简单如此,注意椭圆的宽高度指长轴长度、短轴长度,而非长半轴、短半轴长度

    ​view source​​​​print​​​​?​
    ​1.​​​​<?php​​​​2.​​​​    ​​​​$image = imagecreatetruecolor(​​​​200​​​​, ​​​​100​​​​);​​​​3.​​​​    ​​​​$background_color = imagecolorallocate($image, ​​​​0x13​​​​, ​​​​0x71​​​​, ​​​​0x32​​​​);​​​​4.​​​​    ​​​​// 填充背景为矩形​​​​5.​​​​    ​​​​imagefilledellipse($image, ​​​​100​​​​, ​​​​50​​​​, ​​​​200​​​​, ​​​​100​​​​, $background_color);​​​​6.​​​​    ​​​​header(​​​​'Content-Type: image/png'​​​​);​​​​7.​​​​    ​​​​imagepng($image);​​​​8.​​​​    ​​​​imagedestroy($image);​
  • php 图片加水印文字水印_宽高_04

  • 3.绘制图像
    实际上第2步中的背景色填充就是在绘制图像,只是默认的黑色背景不好看,所以可以先给它填充个另外的颜色。绘图时也讲究个坐标、宽高的问题。老样子,屏幕坐标原点在左上角,水平往右X值学大,竖直向下Y值越大,以像素为单位。除了imagefill外还有:
    像素点:imagesetpixel
    直线:imageline
    矩形:imagerectangle
    多边形:imagepolygon
    椭圆:imageellipse
    圆弧:imagearc
    以上的矩形、多边形、椭圆均有对应的填充类型函数,即它们只是画一个简单的形状边线。一段测试代码

    ​view source​​​​print​​​​?​
    ​01.​​​​<?php​​​​02.​​​​    ​​​​$width = ​​​​200​​​​;​​​​03.​​​​    ​​​​$height = ​​​​450​​​​;​​​​04.​​​​    ​​​​// 创建图像,得到一个资源变量​​​​05.​​​​    ​​​​$img = imagecreatetruecolor($width, $height);​​​​06.​​​​    ​​​​// 分配颜色​​​​07.​​​​    ​​​​$orange = imagecolorallocate($img, ​​​​0xff​​​​, ​​​​0x66​​​​, ​​​​0x33​​​​); ​​​​08.​​​​    ​​​​$creamy_white = imagecolorallocate($img, ​​​​0xe8​​​​, ​​​​0xe9​​​​, ​​​​0xdb​​​​); ​​​​09.​​​​    ​​​​$blue = imagecolorallocate($img, ​​​​0x1e​​​​, ​​​​0x90​​​​, ​​​​0xff​​​​);​​​​10.​​​​    ​​​​$green = imagecolorallocate($img, ​​​​0x64​​​​, ​​​​0xb1​​​​, ​​​​0x67​​​​);​​​​11.​​​​    ​​​​$red = imagecolorallocate($img, ​​​​0xf6​​​​, ​​​​0x65​​​​, ​​​​0x78​​​​);​​​​12.​​​​    ​​​​// 填充背景​​​​13.​​​​    ​​​​imagefill($img, ​​​​0​​​​, ​​​​0​​​​, $creamy_white);  ​​​​14.​​​​    ​​​​// 画线​​​​15.​​​​    ​​​​imageline($img, ​​​​10​​​​, ​​​​10​​​​, ​​​​100​​​​, ​​​​60​​​​, $orange);    ​​​​16.​​​​    ​​​​// 画一个填充的矩形​​​​17.​​​​    ​​​​imagefilledrectangle($img, ​​​​10​​​​, ​​​​70​​​​, ​​​​160​​​​, ​​​​150​​​​, $blue); ​​​​18.​​​​    ​​​​// 画多边形​​​​19.​​​​    ​​​​$point_coords = array(​​​​10​​​​, ​​​​160​​​​, ​​​​50​​​​, ​​​​170​​​​, ​​​​120​​​​, ​​​​270​​​​, ​​​​5​​​​, ​​​​250​​​​);​​​​20.​​​​    ​​​​imagepolygon($img, $point_coords, count($point_coords)/​​​​2​​​​, $green); ​​​​21.​​​​    ​​​​//imagefilledpolygon($img, $point_coords, count($point_coords)/2, $green); // 画一个填充多边形​​​​22.​​​​    ​​​​// 画一段圆弧​​​​23.​​​​    ​​​​imagearc($img, ​​​​80​​​​, ​​​​310​​​​, ​​​​80​​​​, ​​​​80​​​​, ​​​​0​​​​, ​​​​240​​​​, $orange);​​​​24.​​​​    ​​​​// 画一个填充的椭圆​​​​25.​​​​    ​​​​imagefilledellipse($img, ​​​​80​​​​, ​​​​400​​​​, ​​​​150​​​​, ​​​​70​​​​, $red);​​​​26.​​​​    ​​ ​​27.​​​​    ​​​​header(​​​​'Content-Type:image/png'​​​​);​​​​28.​​​​    ​​​​imagepng($img);  ​​​​// 生成图像​​​​29.​​​​    ​​​​imagedestroy($img);  ​​​​// 释放资源​
    效果
  • php 图片加水印文字水印_php_05

  • 例如,画直线方法原型:bool imageline(resource $image, int $x1, int $y1, int $x2, int $y2, int $color),x1,y1和x2,y2是线的起点和终点坐标,画直线就是从这个点到哪个点。填充矩形方法中,x1,y1和x2,y2分别对应矩形的左上角和右下角坐标。多边形的方法:bool imagepolygon(resource $image, array $points, int $num_points, int $color),第二个参数$points是个一维数组,里边放着多边形各个顶点的坐标值,最好按照顺时针或逆时针围着多边形写,不会遗漏,第三个参数$num_points是顶点个数,所以是第二个坐标值数组的总数除2,这点要注意。画圆弧imagearc这里是画个弧线,也有对应的imagefilledarc可以画一个填充的饼状弧形。对于画椭圆imagefilledellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color),$cx、$cy是椭圆中心坐标,$width、$height是指长轴长(宽)、短轴长(高)。
    4. 绘制文字字符串
    除了画这些图形,gd库允许我们画单个字符和字符串,比如水平画一个字符串方法:bool imagestring(resource $image, int $font, int $x, int $y, string $s, int $col),$image是图像句柄,$font是字体类型,gd内置五种字体(貌似除了大小外都差不多)。用int值标识它们(1至5,值越大字越大),传入其中一个即可,$x、$y是坐标值,指一串字符串的左上角的坐标(参考前面例子)。既然强调了水平画一个字符串,不出意外就有竖直方向的,确实有:imagestringup,对于画单个字符同理:imagechar和imagecharup。绘制字符能干什么,最经典的莫过于验证码了,试着写了个简单的验证码类

    ​view source​​​​print​​​​?​
    ​001.​​​​<?php​​​​002.​​​​    ​​​​class​​ ​​Validcode​​​​003.​​​​    ​​​​{​​​​004.​​​​        ​​​​private​​ ​​$codeNum = ​​​​4​​​​;   ​​​​// 验证码个数​​​​005.​​​​        ​​​​private​​ ​​$width = ​​​​80​​​​;    ​​​​// 图像宽度​​​​006.​​​​        ​​​​private​​ ​​$height = ​​​​20​​​​;    ​​​​// 图像高度​​​​007.​​​​        ​​​​private​​ ​​$image = ​​​​false​​​​;        ​​​​// 图像句柄​​​​008.​​​​        ​​​​private​​ ​​static​​ ​​$colors = array();    ​​​​// 颜色色值​​​​009.​​​​        ​​​​private​​ ​​$vcodes = ​​​​''​​​​;        ​​​​// 验证码字符串​​​​010.​​​​        ​​​​private​​ ​​static​​ ​​$instance = ​​​​null​​​​;    ​​​​// 当前实例​​​​011.​​​​        ​​​​private​​ ​​function __construct($num = ​​​​4​​​​, $width = ​​​​80​​​​, $height = ​​​​20​​​​)​​​​012.​​​​        ​​​​{​​​​013.​​​​            ​​​​if​​​​(!extension_loaded(​​​​'gd'​​​​))​​​​014.​​​​            ​​​​{​​​​015.​​​​                ​​​​exit(​​​​'fatal error: no gd extension!'​​​​);​​​​016.​​​​            ​​​​}​​​​017.​​​​            ​​​​// 规定字符数为3到5个​​​​018.​​​​            ​​​​if​​​​((​​​​int​​​​)$num < ​​​​2​​ ​​|| (​​​​int​​​​)$num > ​​​​5​​​​) ​​​​019.​​​​            ​​​​{​​​​020.​​​​                ​​​​$num = ​​​​4​​​​;​​​​021.​​​​            ​​​​}​​​​022.​​​​            ​​​​$​​​​this​​​​->codeNum = (​​​​int​​​​)$num;​​​​023.​​​​            ​​​​// 限制宽高​​​​024.​​​​            ​​​​$min_width = (imagefontwidth(​​​​5​​​​) * $​​​​this​​​​->codeNum) + ​​​​10​​​​;​​​​025.​​​​            ​​​​$min_height = imagefontheight(​​​​5​​​​) + ​​​​10​​​​;​​​​026.​​​​            ​​​​$width < $min_width && $width = $min_width;​​​​027.​​​​            ​​​​$height < $min_height && $height = $min_height;​​​​028.​​​​            ​​​​$​​​​this​​​​->width = $width;​​​​029.​​​​            ​​​​$​​​​this​​​​->height = $height;​​​​030.​​​​        ​​​​}​​​​031.​​​​        ​​​​// 获取单例​​​​032.​​​​        ​​​​public​​ ​​static​​  ​​function getInstance($num = ​​​​4​​​​, $width = ​​​​80​​​​, $height = ​​​​20​​​​)​​​​033.​​​​        ​​​​{​​​​034.​​​​            ​​​​if​​​​(self::$instance === ​​​​null​​​​)​​​​035.​​​​            ​​​​{​​​​036.​​​​                ​​​​self::$instance = ​​​​new​​ ​​self($num, $width, $height);​​​​037.​​​​            ​​​​}​​​​038.​​​​            ​​​​return​​ ​​self::$instance;​​​​039.​​​​        ​​​​}​​​​040.​​​​        ​​​​/**​​​​041.​​​​         ​​​​* 获取图像句柄​​​​042.​​​​         ​​​​*/​​​​043.​​​​        ​​​​private​​ ​​function getImage()​​​​044.​​​​        ​​​​{​​​​045.​​​​            ​​​​if​​​​($​​​​this​​​​->image === ​​​​false​​​​)​​​​046.​​​​                ​​​​$​​​​this​​​​->image = imagecreatetruecolor($​​​​this​​​​->width, $​​​​this​​​​->height);​​​​047.​​​​            ​​​​if​​​​(!$​​​​this​​​​->image)​​​​048.​​​​                ​​​​exit(​​​​'can not initialize image resource!'​​​​);​​​​049.​​​​            ​​​​// 添加一个默认背景色到数组​​​​050.​​​​            ​​​​self::$colors[​​​​'yello_back'​​​​] = imagecolorallocate($​​​​this​​​​->image, ​​​​0xf5​​​​, ​​​​0xf5​​​​, ​​​​0xdc​​​​);​​​​051.​​​​        ​​​​}​​​​052.​​​​        ​​​​/** ​​​​053.​​​​         ​​​​* 添加颜色​​​​054.​​​​         ​​​​* @param color array('colorKey'=>array(r,g,b),)​​​​055.​​​​         ​​​​* 注意格式参数,array(键名=>array(r值, g值, b值),),可一次添加多个​​​​056.​​​​         ​​​​*/​​​​057.​​​​        ​​​​public​​ ​​function addColors($colors = array())​​​​058.​​​​        ​​​​{​​​​059.​​​​            ​​​​if​​​​(!is_array($colors))​​​​060.​​​​            ​​​​{​​​​061.​​​​                ​​​​echo ​​​​'ERROR: pass array of colors data. LINE:'​​​​.__LINE__.​​​​'<br/>'​​​​;​​​​062.​​​​                ​​​​return​​ ​​false​​​​;​​​​063.​​​​            ​​​​}​​​​064.​​​​            ​​​​if​​​​(!$​​​​this​​​​->image)​​​​065.​​​​            ​​​​{    ​​​​066.​​​​                ​​​​echo ​​​​'ERROR: uninilitialized image resource. LINE:'​​​​.__LINE__.​​​​'<br/>'​​​​;​​​​067.​​​​                ​​​​return​​ ​​false​​​​;​​​​068.​​​​            ​​​​}​​​​069.​​​​            ​​​​// 批量添加颜色    ​​​​070.​​​​            ​​​​foreach($colors as $colKey=>$colVal)​​​​071.​​​​            ​​​​{​​​​072.​​​​                ​​​​if​​​​(!is_array($colVal) || count($colVal) < ​​​​3​​​​)​​​​073.​​​​                    ​​​​continue​​​​;​​​​074.​​​​                ​​​​$rgb = array();​​​​075.​​​​                ​​​​foreach($colVal as $val)​​​​076.​​​​                ​​​​{​​​​077.​​​​                    ​​​​$rgb[] = (​​​​int​​​​)$val;​​​​078.​​​​                ​​​​}​​​​079.​​​​                ​​​​self::$colors[$colKey] = imagecolorallocate($​​​​this​​​​->image, $rgb[​​​​0​​​​], $rgb[​​​​1​​​​], $rgb[​​​​2​​​​]);​​​​080.​​​​            ​​​​}​​​​081.​​​​            ​​​​return​​ ​​true​​​​;​​​​082.​​​​        ​​​​}​​​​083.​​​​        ​​​​/**​​​​084.​​​​         ​​​​* 设置背景色,请保证$x,$y坐标位于画布内​​​​085.​​​​         ​​​​* @param colorName string 添加过的颜色对应的名称​​​​086.​​​​         ​​​​*/​​​​087.​​​​        ​​​​public​​ ​​function fillBackgroundColor($x = ​​​​0​​​​, $y = ​​​​0​​​​, $colorName = ​​​​'yello_back'​​​​)​​​​088.​​​​        ​​​​{​​​​089.​​​​            ​​​​if​​​​($​​​​this​​​​->image && isset(self::$colors[$colorName]))​​​​090.​​​​            ​​​​{​​​​091.​​​​                ​​​​return​​ ​​imagefill($​​​​this​​​​->image, $x, $y, self::$colors[$colorName]);​​​​092.​​​​            ​​​​}​​​​093.​​​​            ​​​​else​​​​094.​​​​            ​​​​{​​​​095.​​​​                ​​​​echo ​​​​'ERROR: fill background color failed. LINE:'​​​​.__LINE__.​​​​'<br/>'​​​​;​​​​096.​​​​                ​​​​return​​ ​​false​​​​;​​​​097.​​​​            ​​​​}​​​​098.​​​​        ​​​​}​​​​099.​​​​        ​​​​/**​​​​100.​​​​         ​​​​* 创建随机验证码​​​​101.​​​​         ​​​​*/​​​​102.​​​​        ​​​​private​​ ​​function createVCode()​​​​103.​​​​        ​​​​{​​​​104.​​​​            ​​​​$chars = ​​​​'23456789'​​​​.​​​​'abcdefghjkmn'​​​​.​​​​105.​​​​                     ​​​​'pqrstuvwxyz'​​​​.​​​​'ABCDEFG'​​​​.​​​​106.​​​​                     ​​​​'HJKLMNPQRSTUVWXYZ'​​​​;​​​​107.​​​​            ​​​​$​​​​this​​​​->vcodes = ​​​​''​​​​;​​​​108.​​ ​​109.​​​​            ​​​​for​​​​($i = ​​​​0​​​​; $i < $​​​​this​​​​->codeNum; $i++)​​​​110.​​​​            ​​​​{​​​​111.​​​​                ​​​​$​​​​this​​​​->vcodes .= $chars[mt_rand(​​​​0​​​​, strlen($chars)-​​​​1​​​​)];​​​​112.​​​​            ​​​​}​​​​113.​​​​            ​​​​return​​ ​​true​​​​;​​​​114.​​​​        ​​​​}​​​​115.​​​​        ​​​​/**​​​​116.​​​​         ​​​​* 在画布上画出验证码​​​​117.​​​​         ​​​​* 字体的大小、颜色、位置随机变化​​​​118.​​​​         ​​​​*/​​​​119.​​​​        ​​​​private​​ ​​function drawVCode()​​​​120.​​​​        ​​​​{​​​​121.​​​​            ​​​​if​​​​($​​​​this​​​​->image === ​​​​false​​​​)​​​​122.​​​​                ​​​​return​​ ​​false​​​​;​​​​123.​​​​            ​​​​if​​​​($​​​​this​​​​->vcodes)​​​​124.​​​​            ​​​​{​​​​125.​​​​                ​​​​for​​​​($i = ​​​​0​​​​; $i < $​​​​this​​​​->codeNum; $i++)​​​​126.​​​​                ​​​​{​​​​127.​​​​                    ​​​​$font_size = mt_rand(​​​​3​​​​, ​​​​5​​​​); ​​​​128.​​​​                    ​​​​$x = $i * floor($​​​​this​​​​->width / $​​​​this​​​​->codeNum) + ​​​​2​​​​;​​​​129.​​​​                    ​​​​$y = mt_rand(​​​​0​​​​, $​​​​this​​​​->height-imagefontheight($font_size));​​​​130.​​​​                    ​​​​$color = imagecolorallocate($​​​​this​​​​->image, mt_rand(​​​​0​​​​, ​​​​128​​​​), mt_rand(​​​​0​​​​, ​​​​128​​​​), mt_rand(​​​​0​​​​, ​​​​128​​​​));​​​​131.​​​​                    ​​​​imagechar($​​​​this​​​​->image, $font_size, $x, $y, $​​​​this​​​​->vcodes[$i], $color);​​​​132.​​​​                ​​​​}​​​​133.​​​​                ​​​​return​​ ​​true​​​​;​​​​134.​​​​            ​​​​}​​​​135.​​​​            ​​​​return​​ ​​false​​​​;​​​​136.​​​​        ​​​​}​​​​137.​​​​        ​​​​/**​​​​138.​​​​         ​​​​* 绘制图像​​​​139.​​​​         ​​​​*/​​​​140.​​​​        ​​​​private​​ ​​function generateImage()​​​​141.​​​​        ​​​​{​​​​142.​​​​            ​​​​if​​​​(!$​​​​this​​​​->image)​​​​143.​​​​            ​​​​{​​​​144.​​​​                ​​​​echo ​​​​'ERROR: invalid image resource. LINE: '​​​​.__LINE__.​​​​'<br/>'​​​​;​​​​145.​​​​                ​​​​return​​ ​​false​​​​;​​​​146.​​​​            ​​​​} ​​​​147.​​​​            ​​​​// 获取当前GD库支持的图片类型,绘制图像​​​​148.​​​​            ​​​​if​​​​(imagetypes() & IMG_PNG)​​​​149.​​​​            ​​​​{​​​​150.​​​​                ​​​​header(​​​​'Content-Type: image/png'​​​​);​​​​151.​​​​                ​​​​imagepng($​​​​this​​​​->image);​​​​152.​​​​            ​​​​}​​​​153.​​​​            ​​​​else​​ ​​if​​​​(imagetypes() & IMG_JPG)​​​​154.​​​​            ​​​​{​​​​155.​​​​                ​​​​header(​​​​'Content-Type: image/jpg'​​​​);​​​​156.​​​​                ​​​​imagejpeg($​​​​this​​​​->image);​​​​157.​​​​            ​​​​}​​​​158.​​​​            ​​​​else​​ ​​if​​​​(imagetypes() & IMG_GIF)​​​​159.​​​​            ​​​​{​​​​160.​​​​                ​​​​header(​​​​'Content-Type: image/gif'​​​​);​​​​161.​​​​                ​​​​imagegif($​​​​this​​​​->image);​​​​162.​​​​            ​​​​}​​​​163.​​​​            ​​​​else​​ ​​if​​​​(imagetypes() & IMG_WBMP)​​​​164.​​​​            ​​​​{​​​​165.​​​​                ​​​​header(​​​​'Content-Type: image/vnd.wap.wbmp'​​​​);​​​​166.​​​​                ​​​​imagejpeg($​​​​this​​​​->image);​​​​167.​​​​            ​​​​}​​​​168.​​​​            ​​​​else​​​​169.​​​​            ​​​​{​​​​170.​​​​                ​​​​exit(​​​​'this version do not support creating image!'​​​​);​​​​171.​​​​            ​​​​}​​​​172.​​ ​​173.​​​​        ​​​​}​​​​174.​​​​        ​​​​/**​​​​175.​​​​         ​​​​* 输出图像​​​​176.​​​​         ​​​​* @param colorName type string|array('key'=>array(int, int, int),)​​​​177.​​​​         ​​​​*/​​​​178.​​​​        ​​​​public​​ ​​function outputImage($color = ​​​​'yello_back'​​​​, $x = ​​​​0​​​​, $y = ​​​​0​​​​)​​​​179.​​​​        ​​​​{​​​​180.​​​​            ​​​​// 初始化图像资源变量​​​​181.​​​​            ​​​​$​​​​this​​​​->getImage();​​​​182.​​​​            ​​​​// 创建验证码字符串     ​​​​183.​​​​            ​​​​$​​​​this​​​​->createVCode();  ​​​​184.​​​​            ​​​​// 填充背景色 ​​​​185.​​​​            ​​​​if​​​​(is_string($color) && isset(self::$colors[$color])) ​​​​//传入字符串时判断已有颜色数组中是否有​​​​186.​​​​            ​​​​{​​​​187.​​​​                ​​​​$​​​​this​​​​->fillBackgroundColor($x, $y, $color);​​​​188.​​​​            ​​​​}​​​​189.​​​​            ​​​​else​​ ​​if​​​​(is_array($color) && count($color) == ​​​​1​​ ​​&& $​​​​this​​​​->addColors($color)) ​​​​// 传入数组进行添加和填充,只能传入一种颜色​​​​190.​​​​            ​​​​{​​​​191.​​​​                ​​​​$colorName = array_keys($color);​​​​192.​​​​                ​​​​$​​​​this​​​​->fillBackgroundColor($x, $y, $colorName[​​​​0​​​​]);​​​​193.​​​​            ​​​​}​​​​194.​​​​            ​​​​else​​      ​​// 否则使用默认背景色填充​​​​195.​​​​            ​​​​{​​​​196.​​​​                ​​​​$​​​​this​​​​->fillBackgroundColor($x, $y, ​​​​'yello_back'​​​​);​​​​197.​​​​            ​​​​}​​​​198.​​​​            ​​​​// 画验证码字符​​​​199.​​​​            ​​​​$​​​​this​​​​->drawVCode();​​​​200.​​​​            ​​​​// 生成图像​​​​201.​​​​            ​​​​$​​​​this​​​​->generateImage();​​​​202.​​​​            ​​​​return​​ ​​''​​​​;​​​​203.​​​​        ​​​​}​​​​204.​​​​        ​​​​/**​​​​205.​​​​         ​​​​* 释放资源​​​​206.​​​​         ​​​​*/​​​​207.​​​​        ​​​​public​​ ​​function __destruct()​​​​208.​​​​        ​​​​{​​​​209.​​​​            ​​​​if​​​​($​​​​this​​​​->image)​​​​210.​​​​                ​​​​imagedestroy($​​​​this​​​​->image);​​​​211.​​​​        ​​​​}​​​​212.​​​​    ​​​​}​​​​213.​​​​    ​​​​// test1: 默认4个字符​​​​214.​​​​    ​​​​$vcodeObj = Validcode::getInstance();​​​​215.​​​​    ​​​​$vcodeObj->outputImage();*/ ​​​​216.​​​​    ​​​​/*​​​​217.​​​​    ​​​​// test2: 3个字符​​​​218.​​​​    ​​​​$vcodeObj = Validcode::getInstance(3);​​​​219.​​​​    ​​​​$vcodeObj->outputImage(); // 3个字符*/​​​​220.​​​​    ​​​​/*​​​​221.​​​​    ​​​​// test3: 设置成5个字符,且图片长宽不合理,使用对象内部调节​​​​222.​​​​    ​​​​$vcodeObj = Validcode::getInstance(5, 1, 1);​​​​223.​​​​    ​​​​// 输出时传入颜色值,替换背景色​​​​224.​​​​    ​​​​$vcodeObj->outputImage(array('col'=>array(255, 255, 0)));​​​​225.​​​​    ​​​​*/​
    三个测试输出的结果:
  • php 图片加水印文字水印_php_06

  •   
  • php 图片加水印文字水印_php_07

  •   
  • php 图片加水印文字水印_宽高_08

  • 效果还行,首先是构造函数,来设置长宽和生成验证码个数,个数定为3到5个,长宽设置最小的话要容得下几个字符的宽度(测试3),否则就有显示不完全了,$codeNum为验证码个数,$weight、$height为图像宽高,$image为图像句柄变量,$colors是一个数组存放可能用到的背景色,$vcodes是验证码字符串。getImage方法获取图像句柄,并添加一个默认的颜色值,作为备用。addColors方法可批量添加颜色,fillBackgroundColor执行填充图像背景色,createVCode创建随机验证码,大小写、数字随机组合,drawVCode在画布上画出验证码,这里穴ky"http://www.it165.net/qq/" target="_blank" >qqxo9ak0enWpL751Mi31rK81Nq7rbK8yc+jrMnPz8K437bIy+a7+qOs0dXJq8vmu/qho2dlbmVyYXRlSW1hZ2W4+b7dtbHHsNans9a1xM28xqzA4NDNo6zJ6NbDzbfQxc+io6yyzr+8udnN+MrWsuG1xMq+wP20+sLroaM8L3A+CjxwPqGhoaHX7rrz0ru49m91dHB1dEltYWdlvdO/2srHvavS1MnPt723qNfpus+jrLXa0ru49rLOyv3UytDt1NrK5LP20enWpMLryrHTw7Srtd21xMmr1rW0+szmtbHHsLG408O1xLGzvrDJq6Os0rK/ybSryOvX1rf7tK7D+6Os1Nqxs76wyavW0NGw1dK21NOmyavWtcr91+myoszus+SjrLWxyLthZGRDb2xvcnPKx7mr09C1xL3Tv9qjrNKyv8nPyLX308PL/MztvNPE47XEsbO+sMmr1rWjrNTZtfdmaWxsQmFja2dyb3VuZENvbG9yzO6z5KOs1Nm199PDb3V0cHV0SW1hZ2W0q8jrttTTptHVyau8/MP7vLS/yaGj0OjSqtei0uK1xMrHo6xmaWxsQmFja2dyb3VuZENvbG9yt723qMzus+Sxs76wyavKsaOs1/ix6ta1JHihoiR50ru2qNKqtffV+9Tau62yvMTao6y38dTyzO6z5M7e0KejrNXiwO/Wu8rHvPK1pdHdyr6jrM28xqzOu9Pa5K/AwMb31/PJz73Ho6zL+dLU1rG908rHKDAsMCmjrLfFtb3Ss8PmxuTL+8671sO1xLuw16LS4rzGy+PX+LHqo6zV4sDvyse+ocG/zby88rWlwcuhozwvcD4KPHA+oaGhobK7vfbKx9Hp1qTC68HLo6zNvMasvNPLrtOh0rK/ydLU1eLDtLjJo6zSu7j2tcDA7X48L3A+CjxwPqGhoaHHsMPmyuSz9tOizsTX1rf7tK6686Os19TIu7b4yLujrM7Sw8e+zb/J0tTP67W9xNy38bvm1sbW0M7Eo6zIt8q1v8nS1KGjx7DD5su1wctHRL/i1tDT0Lj2RnJlZVR5cGW1xNfWzOXS/cfmo6y2+HBocMzhuanBy2ltYWdlZnR0ZXh0us1pbWFnZXR0ZsG9uPa3vbeox7DV38rHPC9wPgo8cD4mbmJzcDu9q0ZyZWVUeXBlIDIg19bM5dC0yOvNvM/xo6y689Xfyse9q1RydWVUeXBl19bM5dC0yOvNvM/xo6yy6cHLz8KjrNXiuPZUcnVlVHlwZcvjysdGcmVlVHlwZbXE19OzydSxo6zL+dLUx7DV38v51qez1rXE19bM5b/iuPy24KOs08PL/Lj809Cxo9akoaPKtbzKyc9XaW7Jz8Pm19S0+NPQ19bM5aOs1NpDOlxXaW5kb3dzXEZvbnRzo6hDxczOqrCy17DFzMqxo6nPwsPmo6y6w8/xsrvKx8O/1ta2vMTcxMPAtNPDo6zRocHL0ru49rrazOXN5tK7z8I8L3A+Cgo8cHJlIGNsYXNzPQ=="brush:java;"><?php $width = 300; $heiht = 300; $image = imagecreatetruecolor($width, $heiht); $yellow = imagecolorallocate($image, 0xff, 0xe6, 0xa4); $blue = imagecolorallocate($image, 0x40, 0x99, 0xff); // 填充背景 imagefilledrectangle($image, 0, 0, $width, $heiht, $yellow); // 字体文件 //$fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simsun.ttc'); $fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simhei.ttf'); $text = '世界如此美妙,我却如此暴躁'; // 需要转换编码吗? //$text = iconv('ANSI', 'UTF-8', $text); // 画文字,text需要时UTF-8编码 imagettftext($image, 12, 0, 20, 50, $blue, $fontfile, $text); // 输出图像 header('Content-Type:image/png'); imagepng($image); imagedestroy($image);
    效果:
  • php 图片加水印文字水印_php_09

  • 在使用字体时,偶发现simsun.ttc这个是简体中文,扩展是.ttc,但是用imagettftext也能用。另,如果你的编辑器编辑的代码不是UTF-8编码,需要使用iconv将文本编码转换过来,特别是文本变量是从数据库中读取时,但是你懂的,什么ANSI、GBK、GB2312等转换为UTF-8时,不出意外会是乱码-_-#。既然能用字体了,就到网上扒了几个免费字体玩了下(比如这个http://www.freefontscenter.com/),这个测试程序前提是需要下载对应字体文件,放到指定目录,注意有的字体扩展是.otf,这个OpenType字体,用imagettftext就不行啦,要用imagefttext ~

    ​view source​​​​print​​​​?​
    ​01.​​​​<?php​​​​02.​​​​    ​​ ​​03.​​​​    ​​​​$width = ​​​​600​​​​; $heiht = ​​​​150​​​​;​​​​04.​​​​    ​​​​$image = imagecreatetruecolor($width, $heiht);​​​​05.​​​​    ​​​​// 添加颜色​​​​06.​​​​    ​​​​$blue = imagecolorallocate($image, ​​​​0x40​​​​, ​​​​0x99​​​​, ​​​​0xff​​​​); #229cdc​​​​07.​​​​    ​​​​$green = imagecolorallocate($image, ​​​​0x59​​​​, ​​​​0x98​​​​, ​​​​0x3b​​​​);​​​​08.​​​​    ​​​​$yellow = imagecolorallocate($image, ​​​​0xff​​​​, ​​​​0xe6​​​​, ​​​​0xa4​​​​);​​​​09.​​​​    ​​​​// 填充背景​​​​10.​​​​    ​​​​imagefilledrectangle($image, ​​​​0​​​​, ​​​​0​​​​, $width, $heiht, $yellow);​​​​11.​​ ​​12.​​​​    ​​​​$text = ​​​​'lazycat'​​​​;​​​​13.​​​​    ​​​​// 1​​​​14.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\Maiandra_GD.ttf'); ​​​​15.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​5​​​​, ​​​​50​​​​, $green, $fontfile, $text);​​​​16.​​​​    ​​​​// 2​​​​17.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\black_jack.ttf');  ​​​​18.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​85​​​​, ​​​​50​​​​, $green, $fontfile, $text);  ​​​​19.​​​​    ​​​​// 3​​​​20.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\OpenSans-Italic.ttf'); ​​​​// ​​​​21.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​155​​​​, ​​​​50​​​​, $green, $fontfile, $text);​​​​22.​​​​    ​​​​// 4​​​​23.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\Amatic-Bold.ttf');​​​​24.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​235​​​​, ​​​​50​​​​, $green, $fontfile, $text);​​​​25.​​​​    ​​​​// 5​​​​26.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\Santana-RegularCondensed.ttf');​​​​27.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​290​​​​, ​​​​50​​​​, $green, $fontfile, $text);​​​​28.​​​​    ​​​​// 6​​​​29.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\veteran_typewriter.ttf');​​​​30.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​345​​​​, ​​​​50​​​​, $green, $fontfile, $text);​​​​31.​​​​    ​​​​// 7​​​​32.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\LondrinaOutline-Regular.ttf');​​​​33.​​​​    ​​​​imagefttext($image, ​​​​20​​​​, ​​​​0​​​​, ​​​​440​​​​, ​​​​50​​​​, $green, $fontfile, $text);​​​​34.​​​​    ​​​​// 8​​​​35.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\SCRATCHM.ttf');​​​​36.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​5​​​​, ​​​​100​​​​, $green, $fontfile, $text);​​​​37.​​​​    ​​​​// 9​​​​38.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\tiza.ttf');​​​​39.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​150​​​​, ​​​​100​​​​, $green, $fontfile, $text);​​​​40.​​​​    ​​​​// 10​​​​41.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\texgyrecursor-regular.otf');​​​​42.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​325​​​​, ​​​​100​​​​, $green, $fontfile, $text);​​​​43.​​​​    ​​​​// 11​​​​44.​​​​    ​​​​$fontfile = str_replace(​​​​'\\', '​​​​/​​​​', '​​​​G:\wamp\fonts\free\yukarimobil.ttf');​​​​45.​​​​    ​​​​imagefttext($image, ​​​​17​​​​, ​​​​0​​​​, ​​​​430​​​​, ​​​​100​​​​, $green, $fontfile, $text);​​​​46.​​​​    ​​​​// 输出图像​​​​47.​​​​    ​​​​header(​​​​'Content-Type:image/png'​​​​);​​​​48.​​​​    ​​​​imagepng($image);​​​​49.​​​​    ​​​​imagedestroy($image);​
    效果:
  • php 图片加水印文字水印_字符串_10

  • 非常炫酷有木有!>3<

破罐子互摔