主要内容:

  1. 加载GD库
  2. 创建图像
  3. 绘制点,线,矩形,多边形,椭圆,弧线
  4. 绘制文字
  5. 通过GD库生成验证码

其实吧,学习图像方法的最大作用,好像就是为了制作验证码。

所以此专题,不如叫做制作验证码。

1、加载GD库

PHP5不仅可以处理文本数据,还可以处理多种格式的图像,安装了GD库,需要通过php.ini来加载GD库。

可以通过phpinfo()方法来确认,如果有gd栏目就说明GD库加载成功了。

phpinfo.php

  1. <?php
  2. phpinfo();
  3. ?>

2、创建图像

GD库处理图像的操作都是先在内存处理,操作完成后再以数据流的方式输出到浏览器,有4个步骤:

  • 创建画布
  • 绘制图像
  • 输出图像
  • 释放资源

创建画布

创建画布就是在内存区中开辟一块存储区

imagecreate.php

  1. <?php
  2. //创建普通画布
  3. $img1=imagecreate(100,100) or die("创建普通画布失败<br/>");
  4. echo "创建普通画布成功<br/>";
  5.  
  6. //创建真彩画布
  7. $img2=imagecreatetruecolor(200,300) or die("创建真彩画布失败<br/>");
  8. echo "创建真彩画布成功<br/>";
  9.  
  10. //获取图像的大小
  11. echo "图像1的x:".imagesx($img1)."<br/>";
  12. echo "图像1的y:".imagesy($img1)."<br/>";
  13. echo "图像2的x:".imagesx($img2)."<br/>";
  14. echo "图像2的y:".imagesy($img2)."<br/>";
  15. ?>

  输出

  1. 创建普通画布成功
  2. 创建真彩画布成功
  3. 图像1x100
  4. 图像1y100
  5. 图像2x200
  6. 图像2y300

其他的方法常用:

  • imagecreatefromgif()通过gif文件或者url新建一个图像
  • imagecreatefromjpeg()通过JPEG文件或者url新建一个图像
  • imagecreatefrompng()通过png或者url新建一个图像
  • imagecreatefrombmp()通过bmp或者url新建一个图像

输出图像

imagegif($image,$filename)输出一个gif格式图像到浏览器,如果第二个参数指定了,则以文件形式输出

imagejpeg($image,$filename)

imagepng($image,$filename)

imageoutput.php

  1. <?php
  2. //创建画布
  3. $image1=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image2=imagecreatefrompng("C:/xampp/htdocs/1.png");//使用本地资源
  5.  
  6. //在输出图像之前清理输出缓冲,否则缓冲中有其他字符串,图像会乱码
  7. ob_clean();
  8.  
  9. //指定输出类型为图像,否则乱码,chrome,Firefox,Opera等浏览器不兼容
  10. header("Content-type:image/jpeg");
  11.  
  12. //输出图像到浏览器
  13. imagejpeg($image1) or die("创建图像失败<br/>");
  14. imagejpeg($image2) or die("创建图像失败<br/>");
  15.  
  16. //释放资源
  17. imagedestroy($image1,$image2);
  18. ?>

  输出

一些方法说明:

ob_clean();用于清理输出缓冲,否则缓冲中有其他字符串会使得图片乱码,最后变为2进制数据

header("Content-type:image/jpeg");指定输出类型为图像,是为了解决浏览器的兼容性问题,否则乱码,chrome,Firefox,Opera等浏览器不兼容,只有IE兼容。

imagedestroy($image1);用于释放资源,让出内存。

设置颜色

前面已经学习了如何建立一张画布,但是没有“彩笔”,绘画就还没有开始,下面来创建“彩笔”,设置颜色。

imagecolorallocate($image,$red,$green,$blue),会返回一个标识,代表了给定的RGB成分组成的颜色。

imagecolorallocate.php

  1. <?php
  2. //创建画布
  3. $image=imagecreate(200,200);
  4.  
  5. //第一次设置的通常为背景色
  6. $red=imagecolorallocate($image,255,0,0);
  7. //设置画笔为蓝色
  8. $blue=imagecolorallocate($image,0,0,255);
  9.  
  10. //输出图像前清理输出缓冲
  11. ob_clean();
  12. //解决chrome兼容性问题
  13. header("Content-type:image/jpeg");
  14. //输出图像到浏览器
  15. imagejpeg($image) or die("创建图像失败<br/>");
  16.  
  17. //释放资源
  18. imagedestroy($image);
  19. ?>

  输出

区域填充

imagefill($image,$x,$y,$color)它会将(x,y)点出颜色相同并且相邻颜色替换为$color设置的颜色。

这里使用rand(0,255)产生一个大于等于0,小于255的随机数来设置颜色。

imagefill.php

  1. <?php
  2. //创建画布
  3. $image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4.  
  5. //第一次设置的通常为背景色
  6. $rand=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));//使用随机数设置颜色
  7. //设置画笔为蓝色
  8. //$blue=imagecolorallocate($image,0,0,255);
  9.  
  10. //区域填充
  11. imagefill($image,10,10,$rand);
  12.  
  13. //输出图像前清理输出缓冲
  14. ob_clean();
  15. //解决chrome兼容性问题
  16. header("Content-type:image/jpeg");
  17. //输出图像到浏览器
  18. imagejpeg($image) or die("创建图像失败<br/>");
  19.  
  20. //释放资源
  21. imagedestroy($image);
  22. ?>

  输出

绘制点,线,矩形,多边形,椭圆,弧线

点和线

imagesetpixel($image,$x,$y,$color)在(x,y)位置使用$color颜色绘制点

imageline($image,$x1,$y1,$x2,$y2,$color)在(x1,y1)到(x2,y2)位置使用$color颜色绘制线

利用下面的这段代码可以在生成验证码的时候生成干扰元素。

imagesetpixel_line.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(200,200);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为蓝色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. //绘制点
  12. for($i=0;$i<1000;$i++){
  13. imagesetpixel($image,rand(0,200),rand(0,200),$white);
  14. }
  15. //绘制线
  16. for($i=0;$i<10;$i++){
  17. imageline($image,rand(0,200),rand(0,200),rand(0,200),rand(0,200),$white);
  18. }
  19.  
  20. //输出图像前清理输出缓冲
  21. ob_clean();
  22. //解决chrome兼容性问题
  23. header("Content-type:image/jpeg");
  24. //输出图像到浏览器
  25. imagejpeg($image) or die("创建图像失败<br/>");
  26.  
  27. //释放资源
  28. imagedestroy($image);
  29. ?>

  输出

矩形

imagerectangle($image,$x1,$y1,$x2,$y2,$color)绘制矩形

imagefilledrectangle($image,$x1,$y1,$x2,$y2,$color)填充矩形

rectangle.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(300,300);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为蓝色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. //绘制矩形
  12. imagerectangle($image,10,10,100,100,$white);
  13. //填充矩形
  14. imagefilledrectangle($image,50,50,100,100,$white);
  15.  
  16. //输出图像前清理输出缓冲
  17. ob_clean();
  18. //解决chrome兼容性问题
  19. header("Content-type:image/jpeg");
  20. //输出图像到浏览器
  21. imagejpeg($image) or die("创建图像失败<br/>");
  22.  
  23. //释放资源
  24. imagedestroy($image);
  25. ?>

  输出

多边形

imagepolygon($image,$arr_points,$num_points,$color)绘制多边形,$arr_points多边形顶点数组数必须大于等于$num_points定点总数

imagefilledpolygon($image,$arr_points,$num_points,$color)填充多边形

imagepolygon.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(300,300);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为蓝色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. $arr_points=array(10,10,50,20,40,30,100,120,200,30,30,150);
  12. //绘制多边形
  13. imagepolygon($image,$arr_points,6,$white);
  14. //填充多边形
  15. imagefilledpolygon($image,$arr_points,5,$white);
  16.  
  17. //输出图像前清理输出缓冲
  18. ob_clean();
  19. //解决chrome兼容性问题
  20. header("Content-type:image/jpeg");
  21. //输出图像到浏览器
  22. imagejpeg($image) or die("创建图像失败<br/>");
  23.  
  24. //释放资源
  25. imagedestroy($image);
  26. ?>

  输出

绘制椭圆

imageellipse($image,$cx,$cy,$width,$height,$color)绘制椭圆

imagefilledellipse($image,$cx,$cy,$width,$height,$color)绘制椭圆

imageellipse.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(300,300);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为蓝色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. //绘制椭圆
  12. imageellipse($image,100,100,200,100,$white);
  13. //填充椭圆
  14. imagefilledellipse($image,100,100,200,100,$white);
  15.  
  16. //输出图像前清理输出缓冲
  17. ob_clean();
  18. //解决chrome兼容性问题
  19. header("Content-type:image/jpeg");
  20. //输出图像到浏览器
  21. imagejpeg($image) or die("创建图像失败<br/>");
  22.  
  23. //释放资源
  24. imagedestroy($image);
  25. ?>

  输出

绘制弧线

imagearc($image,$cx,$cy,$width,$height,$start,$end,$color)绘制弧线,$start是开始角度,$end是结束角度

imagefilledarc($image,$cx,$cy,$width,$height,$start,$end,$color,$mode)填充弧线,$start是开始角度,$end是结束角度

imagearc.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(300,300);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为蓝色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. //绘制椭圆
  12. imagearc($image,100,100,200,200,0,90,$white);
  13. //填充椭圆
  14. imagefilledarc($image,100,100,200,200,0,45,$white,IMG_ARC_PIE);
  15.  
  16. //输出图像前清理输出缓冲
  17. ob_clean();
  18. //解决chrome兼容性问题
  19. header("Content-type:image/jpeg");
  20. //输出图像到浏览器
  21. imagejpeg($image) or die("创建图像失败<br/>");
  22.  
  23. //释放资源
  24. imagedestroy($image);
  25. ?>

  输出

绘制文字

imagestring($image,$font,$x,$y,$data,$color)水平绘制一行字符串,使用$font字体(内置字体为1,2,3,4,5)写$data内容,(x,y)位置为内容左上角。

imagestringup($image,$font,$x,$y,$data,$color)垂直绘制一行字符串

imagechar($image,$font,$x,$y,$data,$color)水平绘制一个字符

imagecharup($image,$font,$x,$y,$data,$color)垂直绘制一个字符

imagettftext($image,$size,$angle,$x,$y,$color,$fontfile,$text)使用truetype字体向图像写入文本

使用$font字体(内置字体为1,2,3,4,5),如果使用其他字体用imageloadfont()

imagestring.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(300,300);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为蓝色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. $data="imagestring";
  12. //绘制文字
  13. imagestring($image,1,100,20,$data,$white);
  14. imagestringup($image,3,30,150,$data,$white);
  15. imagestring($image,5,100,100,$data,$white);
  16.  
  17. //绘制字符
  18. imagechar($image,5,200,20,$data,$white);
  19.  
  20. //输出图像前清理输出缓冲
  21. ob_clean();
  22. //解决chrome兼容性问题
  23. header("Content-type:image/jpeg");
  24. //输出图像到浏览器
  25. imagejpeg($image) or die("创建图像失败<br/>");
  26.  
  27. //释放资源
  28. imagedestroy($image);
  29. ?>

  输出

使用字库,字库文件默认在:C:\Windows\Fonts

imagettftext.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(500,500);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为白色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. $data="hello PHP";
  12. //绘制truetype文字
  13. imagettftext($image,55,0,50,250,$white,"C:/Windows/Fonts/Arial.ttf",$data);
  14. imagettftext($image,55,90,250,400,$white,"C:/Windows/Fonts/Arial.ttf",$data);
  15. imagettftext($image,55,45,100,370,$white,"C:/Windows/Fonts/Arial.ttf",$data);
  16. imagettftext($image,55,135,370,330,$white,"C:/Windows/Fonts/Arial.ttf",$data);
  17.  
  18. //输出图像前清理输出缓冲
  19. ob_clean();
  20. //解决chrome兼容性问题
  21. header("Content-type:image/jpeg");
  22. //输出图像到浏览器
  23. imagejpeg($image) or die("创建图像失败<br/>");
  24.  
  25. //释放资源
  26. imagedestroy($image);
  27. ?>

  输出

通过GD库生成验证码

在网上注册一些账号,常常遇到注册码输入,生成验证码步骤:

  1. 创建画布
  2. 随机绘制字符
  3. 绘制干扰元素
  4. 输出图像到浏览器
  5. 释放资源

check_data.php

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(200,100);
  5.  
  6. //第一次设置的通常为背景色
  7. $black=imagecolorallocate($image,0,0,0);
  8. //设置画笔为白色
  9. $white=imagecolorallocate($image,255,255,255);
  10.  
  11. //产生随机干扰线条
  12. for($i=0;$i<9;$i++){
  13. imageline($image,rand(0,200),rand(0,100),rand(0,200),rand(0,100),$white);
  14. }
  15. //产生随机干扰点
  16. for($i=0;$i<200;$i++){
  17. imagesetpixel($image,rand(0,200),rand(0,100),$white);
  18. }
  19. //产生4个字符的字符串
  20. for($i=0,$data='';$i<4;$i++){
  21. switch(rand(1,3)){
  22. case '1':$ch=rand(0,9);break;
  23. case '2':$ch=sprintf('%c',rand(97,122));break;
  24. case '3':$ch=sprintf('%c',rand(65,90));break;
  25. }
  26. $data.=$ch;
  27. }
  28.  
  29. //绘制truetype文字
  30. imagettftext($image,32,rand(1,15),20,70,$white,"C:/Windows/Fonts/Arial.ttf",$data);
  31.  
  32. //输出图像前清理输出缓冲
  33. ob_clean();
  34. //解决chrome兼容性问题
  35. header("Content-type:image/jpeg");
  36. //输出图像到浏览器
  37. imagejpeg($image) or die("创建图像失败<br/>");
  38.  
  39. //释放资源
  40. imagedestroy($image);
  41. ?>

  可能输出

最后来一个好玩的图像

他的实现代码如下

  1. <?php
  2. //创建画布
  3. //$image=imagecreatefromjpeg("http://pic.58pic.com/58pic/13/19/83/30J58PICFBZ_1024.jpg");//使用网络资源
  4. $image=imagecreate(500,500);
  5.  
  6. //第一次设置的通常为背景色
  7. $white=imagecolorallocate($image,255,255,255);
  8.  
  9. //设置画笔
  10. $black=imagecolorallocate($image,0,0,0);
  11.  
  12. $data="Hello PHP!";
  13. //绘制truetype文字
  14. for($i=0;$i<360;$i+=5){
  15. imagettftext($image,35,$i,250,250,$black,"C:/Windows/Fonts/Arial.ttf",$data);
  16. }
  17.  
  18. //输出图像前清理输出缓冲
  19. ob_clean();
  20. //解决chrome兼容性问题
  21. header("Content-type:image/jpeg");
  22. //输出图像到浏览器
  23. imagejpeg($image) or die("创建图像失败<br/>");
  24.  
  25. //释放资源
  26. imagedestroy($image);
  27. ?>

  

ok,就到这里吧。

PHP学习8——图像处理的更多相关文章

  1. C#学习笔记-图像处理篇(一)绘制公章

    上个月免费帮别人做事,就一直在服务员和程序员中来回切换,所以好多事情都弄得乱糟糟的,家里也是乱七八糟的,所以学习这一块也放了一段时间. 刚刚开始当服务员的时间看到了形形色色的人,觉得很好玩,他们每个人 ...

  2. 分享用于学习C++图像处理的代码示例

    为了便于学习图像处理并研究图像算法, 俺写了一个适合初学者学习的小小框架. 麻雀虽小五脏俱全. 采用的加解码库:stb_image 官方:http://nothings.org/ stb_image. ...

  3. paper 108:系统学习数字图像处理之图像复原与重建

    首先,必须注意这里所限制的处理条件. 关于图像退化/复原模型 退化的图像是由成像系统的退化加上额外的噪声形成的. 1.只考虑噪声引起的退化 噪声模型,包含于空间不相关和相关两种,除了空间周期噪声,这里 ...

  4. aforge 学习-基本图像处理要用的类库

    1.图像灰度化:Grayscale.CommonAlgorithms.BT709(3种) FiltersSequence =new  FiltersSequence(数组处理函数): 2.二值化(阈值 ...

  5. python学习-Pillow图像处理

    Pillow中文文档:https://pillow-cn.readthedocs.io/zh_CN/latest/handbook/tutorial.html 安装:pip install pillo ...

  6. PHP学习之图像处理-水印类

    <?php $image = new Image(); $image->water('./upload/up_5cf0caca0565b.png','./upload/up_5cf0cb3 ...

  7. 数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波

    0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> ...

  8. 使用FSharp 探索Dotnet图像处理功能1--反色变化

    坚持写博客是最近的目标.加油. 业余学习fsharp以来一直觉得这才是Dotnet开发,或者说所有开发者应该拥有的语言.配合Visual Studio的代码提示,即时执行窗口.开发程序有着极大的乐趣. ...

  9. 分享用于学习C++音频处理的代码示例

    与<分享用于学习C++图像处理的代码示例>为姊妹篇. 为了便于学习C++音频处理并研究音频算法, 俺写了一个适合初学者学习的小小框架. 麻雀虽小五脏俱全,仅仅考虑单通道处理. 采用Deco ...

随机推荐

  1. 在CMD中建立一个不能删除的文件

    Windows 下不能够以下面这些字样来命名文件/文件夹,包括:“aux”“com1”“com2”“prn”“con”和“nul”等,因为这些名字都属于设备名称,等价于一个 DOS 设备,如果我们把文 ...

  2. js返回上一级代码和刷新页面代码

    返回上一级代码: <a href="javascript:;" onclick="history.go(-1);" class="icon_ba ...

  3. “全栈2019”Java第五十九章:抽象类与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. Python中执行变量而非字符串

    Python中执行变量而非字符串 设想这样的场景,你需要大型项目的开发.但是项目的开发第一步是啥? 当然是import导入了. ...but............ 默认 import 后面跟着字符串 ...

  5. PL/SQL那点事-->修改Oracle数据库里面的字段长度

    在开发过程中,遇到有个问题:在Oracle数据库中,利用PL/SQL数据库开发工具来开发,某一字段的长度不能满足需求时候,采用下面的语法就行修改 alter table 表名 modify 字段名 长 ...

  6. Mac 更改/usr/bin 目录权限失败

    对于Mac OS X 10.11 El Capitan用户,由于系统启用了SIP(System Integrity Protection), 导致root用户也没有权限修改/usr/bin目录.按如下 ...

  7. springBoot 实现中文国际化

    一:实现效果如下: 二 SpringBoot 国际化配置 1.创建国际化配置文件(3个): messages.properties messages.user.name=用户名 messages.us ...

  8. Numpy中扁平化函数ravel()和flatten()的区别

    在Numpy中经常使用到的操作由扁平化操作,Numpy提供了两个函数进行此操作,他们的功能相同,但在内存上有很大的不同. 先来看这两个函数的使用: from numpy import * a = ar ...

  9. js计算数值

    1.丢弃小数部分,保留整数部分 parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.f ...

  10. java的值传递

    java中都是值传递 如果参数是引用类型的,实际上是把引用地址复制了一份传递 例如 User user = new User(); user存放在栈中,里面存放着内存地址,new User()会在堆中 ...