主要内容:

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

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

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

1、加载GD库

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

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

phpinfo.php

<?phpphpinfo();
?>

2、创建图像

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

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

创建画布

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

imagecreate.php

<?php//创建普通画布$img1=imagecreate(100,100) or die("创建普通画布失败<br/>");echo "创建普通画布成功<br/>";//创建真彩画布$img2=imagecreatetruecolor(200,300) or die("创建真彩画布失败<br/>");echo "创建真彩画布成功<br/>";//获取图像的大小echo "图像1的x:".imagesx($img1)."<br/>";echo "图像1的y:".imagesy($img1)."<br/>";echo "图像2的x:".imagesx($img2)."<br/>";echo "图像2的y:".imagesy($img2)."<br/>";
?>

  输出

创建普通画布成功
创建真彩画布成功
图像1的x:100
图像1的y:100
图像2的x:200
图像2的y:300

其他的方法常用:

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

输出图像

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

imagejpeg($image,$filename)

imagepng($image,$filename)

imageoutput.php

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

  输出

一些方法说明:

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

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

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

设置颜色

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

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

imagecolorallocate.php

<?php//创建画布$image=imagecreate(200,200);//第一次设置的通常为背景色$red=imagecolorallocate($image,255,0,0);//设置画笔为蓝色$blue=imagecolorallocate($image,0,0,255);//输出图像前清理输出缓冲ob_clean();//解决chrome兼容性问题header("Content-type:image/jpeg");//输出图像到浏览器imagejpeg($image) or die("创建图像失败<br/>");//释放资源imagedestroy($image);
?>

  输出

区域填充

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

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

imagefill.php

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

  输出

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

点和线

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

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

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

imagesetpixel_line.php

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

  输出

矩形

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

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

rectangle.php

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

  输出

多边形

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

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

imagepolygon.php

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

  输出

绘制椭圆

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

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

imageellipse.php

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

  输出

绘制弧线

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

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

  输出

绘制文字

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

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

  输出

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

imagettftext.php

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

  输出

通过GD库生成验证码

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

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

check_data.php

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

  可能输出

最后来一个好玩的图像

他的实现代码如下

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

  

ok,就到这里吧。

PHP学习8——图像处理相关推荐

  1. python学习-Pillow图像处理

    python学习-Pillow图像处理 Pillow中文文档:https://pillow-cn.readthedocs.io/zh_CN/latest/handbook/tutorial.html ...

  2. 学习数字图像处理经验谈

    一.面向应用:层层分解.抓住要点 我们学习数字图像处理的最终目的还是应用,不管是用它来研制产品还是研发项目抑或是研究课题,都要用数字图像处理的理论.方法和技术来解决实际问题.在此过程中,提高效率是非常 ...

  3. 深度学习(图像处理)代码库

    为大家整理的代码资源库,收集了大量深度学习项目图像处理领域的代码链接.包括图像识别,图像生成,看图说话等等方向的代码,所有代码均按照所属技术领域建立索引,以便大家查阅使用. 2.1 图像生成  2.1 ...

  4. 在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

    在pycharm中学习opencv图像处理 安装python 下载python安装包 开始安装 安装pycharm社区版 下载pycharm安装包 开始安装 启动pycharm创建第一个项目 创建第一 ...

  5. 双一流博士整理的计算机视觉学习路线(深度学习+传统图像处理)

    因工作需要,年初花了4个月左右时间学习了机器学习.神经网络相关的知识,工作日每天大概学习4-6个小时,周末每天大概10个小时,工作中的需求应对也得心应手了. 想快速入门的话,从自己的经验看,可以先不看 ...

  6. PyTorch学习笔记——图像处理(transforms.Normalize 归一化)

    PyTorch学习笔记--图像处理 transforms.Normalize 归一化 回顾 torchvision.ToTensor 归一化 transforms.Normalize 公式 回顾 to ...

  7. 国科大学习资料--图像处理与分析(王伟强)-2018期末考试题(含答案)

    国科大学习资料–图像处理与分析(王伟强)-2018期末考试题(含答案) 国科大学习资料–图像处理与分析(王伟强)-2018期末考试题(含答案) 国科大学习资料–图像处理与分析(王伟强)-2018期末考 ...

  8. 国科大学习资料--图像处理与分析--2017年期末考试回顾

    国科大学习资料–图像处理与分析(王伟强)–2017年期末考试回顾 =================================================================== ...

  9. 第 12 章 基于块匹配的全景图像拼接--Matlab深度学习实战图像处理应用

    第 12 章 基于块匹配的全景图像拼接–Matlab深度学习实战图像处理应用GUI实现 效果如图所示 完整案例 主函数文件 Gui_Main.m文件 function varargout = Gui_ ...

  10. 国科大学习资料–图像处理(彭思龙、杨戈)--第三次作业

    国科大学习资料–图像处理–第三次作业(彭思龙)(附完整代码) 答案仅供参考,严禁转载抄袭 题目 编一个程序实现如下功能: 1.读入一幅指纹图像(自己找): 2.对图像进行二值化(方法自定,可以是阈值法 ...

最新文章

  1. php mysql or_mysql条件查询and or使用方法及优先级实例分析
  2. SAP PM 入门系列7 - 常用Function Modules
  3. social psychology 10th David G. Myers
  4. 046_Timeline时间线
  5. 5G时代 我国在通信技术领域弯道超车指日可待
  6. VS2010中使用JSONCPP方法
  7. PAT1047 编程团体赛 (20 分)
  8. 前端H5怎么切换语言_「自学系列一」HTML5大前端学习路线+视频教程完整版
  9. Linux ps命令、Linux top命令
  10. 16岁高中生的「卷」,用13000+行代码,从头写了一个C++机器学习库
  11. opensource项目_来自Opensource.com的开放硬件资源
  12. python创造订单失败_使用Python API创建新订单,get AttributeError:“str”对象没有属性“iteritems”...
  13. ExcelHelper代码
  14. 安卓机顶盒运行linux,全志 Allwinner A20 机顶盒刷入原生 Debian
  15. android 陀螺仪传感器性能损耗,传感器专题(3)——加速度/陀螺仪传感器
  16. 大学生端午节网页作业制作 学生端午节日网页设计模板 传统文化节日端午节静态网页成品代码下载 端午节日网页设计作品
  17. [译]关于Android图形系统一些事实真相
  18. js操作html节点中怎么删除子节点,在JavaScript中删除DOM节点的所有子元素
  19. open edx_Open edX入门以托管您的课程
  20. 数字趣解-不可思议的《魔兽世界》

热门文章

  1. 打通版微社区(5):部署DZ3.2
  2. scala编程第18章学习笔记——有状态的对象
  3. 代替Reflection(反射)的一些方法
  4. 转:Google的系统工程师(SA)如何工作
  5. 梦想与现实之间的距离
  6. 性能测试之二——性能测试的流程
  7. 使用inetaddress测试目标可达性_纯java手写打造方法级白盒测试框架
  8. 关于零基础学习web前端开发,有些过来经验分享
  9. 对我国超级计算机的应用,要加强我国超级计算机应用人才储备
  10. html源码蔡,html基础代码详解