一:引入与介绍

PHP 除了可以处理文本数据外,通过一个叫 GD 的 PHP 扩展库,PHP 还可以动态生成不同格式图像或者对已有图片进行加工处理。

GD库是什么: GD 库(也可以称为 GD2 函数库)是一个开源的用于创建图形图像的函数库,该函数库由C语言编写,可以在 Perl,PHP 等多种语言中使用。GD 库中提供了一系列用来处理图片的 API(接口),使用 GD 库可以处理图片、生成图片,也可以给图片加水印等。另外,很多开源项目都对 GD 库提供了很好的技术支持,如 Jpgraph 类库就是基于 GD 库开发的用于制作复杂统计图的类库。

GD库可以做什么: 在 PHP 中使用 GD 库可以在页面中绘制各种图形图像,以及统计图,如果与 Ajax 技术相结合还可以制作出各种强大的动态图表。还有就是在网站登陆页面中使用的验证码,也可以使用 GD 库来实现。需要注意的是,GD 库开始时是支持 GIF 格式的,但由于 GIF 使用了有版权争议的 LZW 算法,会引起法律问题,于是从 GD 库 1.6 版起所有的 GIF 支持都移除了,但是又在 GD 库 2.0.28 版起又加了回来。如果使用了二者之间版本的 GD 库时,有关 GIF 相关函数是不可用。

开启GD库扩展: GD 库在 PHP5 及以上的版本中是默认安装好的,但是在使用之前需要先开启 GD 库,在 Windows 系统下只需将 php.ini 配置文件中“extension=php_gd2.dll”一项前面的注释删除即可。注意:不同版本的 PHP,它们配置文件中关于 GD 库的配置项也能有所不同,比如在 php7.2 及之后的版本中 GD 库的配置项就变成了“extension=gd2”。
是否引入成功可以通过phpinfo()函数查看:
或者通过打印 gd_info() 函数来验证 GD 库是否安装成功:

二:利用画布资源

在 PHP 中,通过 GD 库处理图像的操作,都是先在内存中处理,操作完成以后再以文件流的方式,输出到浏览器或保存在服务器的磁盘中。创建图像一般分为 4 个基本步骤。

  • 创建画布:所有的绘图设计都需要在一个背景图片上完成,而画布实际上就是在内存中开辟的一块临时区域,用于存储图像的信息。以后的图像操作都将基于这个背景画布,该画布的管理就类似于我们在画画时使用的画布。
  • 绘制图像:画布创建完成以后,就可以通过这个画布资源,使用各种画像函数设置图像的颜色、填充画布、画点、线段、各种几何图形,以及向图像中添加文本等。
  • 输出图像:完成整个图像的绘制以后,需要将图像以某种格式保存到服务器指定的文件中,或将图像直接输出到浏览器上显示给用户。在图像输出之前,一定要使用 header() 函数发送 Content-type 通知浏览器,这次发送的是图片不是文本。
  • 释放资源:图像被输出以后,画布中的内容也不再有用。出于节约系统资源的考虑,需要及时清除画布占用的所有内存资源。

1. 创建画布

1). imagecreate(宽, 高): 创建一个空白画布(背景是白色)
2). imagecreatetruecolor(宽, 高):创建一个真彩画布(背景色是黑色, 需要填充)
3). imagecreatefromjpeg(图片文件路径):打开一个jpeg格式的图片资源
4). imagecreatefromgif(图片文件路径): 打开一个gif格式图片资源(PHP中无法实现动态)
5). imagecreatefrompng(图片文件路径): 打开png格式图片资源

imagecreate(int $width, int $height)和imagecreatetruecolor(int $width, int $height)两个函数都可以创建一张画布,而且成功后都会返回一个资源句柄,失败则返回 FALSE。不同的是它们可以容纳的色彩范围不同,imagecreate() 创建一个基于普通调色板的图像,通常支持 256 色;而 imagecreatetruecolor() 可以创建一个真色彩图像,但是它不能用于 GIF 格式图像。

echo "<pre>";// 创建一个空白画布
$img1 = @imagecreate(100, 100) or die('图片初始化失败');
var_dump($img1);
// 创建一个真彩画布
$img2 = @imagecreatetruecolor(100, 100) or die('图片初始化失败');
var_dump($img2);/** 由于没有在画布上执行任何操作,所以浏览器不会输出画布。* 但是可以通过 imagesx() 和 imagesy() 来获取图像的宽和高(单位是像素)*/
echo '画布1的宽度为:'.imagesx($img1).'像素' . '<br>';
echo '画布1的高度为:'.imagesy($img1).'像素' . '<br>';// 从已有的jpeg图片中打开资源
$img3 = @imagecreatefromjpeg('../0.image/52.jpeg') or die('图片初始化失败');
var_dump($img3);

2. 输出图像

在 PHP 中可以使用不同的函数输出不同格式的图像,如下表所示是常用的图像输出函数。

函数名 描述
imagegif() 输出一个GIF格式图像到浏览器或文件
imagejpeg() 输出一个JPEG格式图像到浏览器或文件
imagepng()  输出一个PNG格式图像到浏览器或文件

语法格式如下:

imagegif($image[, $filename]);  // 保存成gif格式图片imagejpeg($image[, $filename[, $quality]]);  // 保存成jpeg格式图片imagepng($image[, $filename]);  // 保存成png格式图片

其中,$image 为创建的图像资源;$filename 为可选参数,用来设置文件的保存路径,如果设置为 NULL,则将会直接输出原始图像流;$quality 为可选参数,用来设置输出图片的质量,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约为 75)。

<?php
// header() 是用来告诉浏览器以什么形式输出图像的,不能省略。如果省略可能会出现乱码。
header('Content-type:image/png');$image = imagecreatefromjpeg('https://www.runoob.com/images/pulpit.jpg');
imagepng($image,'php.png');

3. 释放资源

在图像的所有资源使用完毕后,通常需要释放图像处理所占用的内存。在 PHP 中可以通过 imagedestroy() 函数来释放图像资源, 另外,释放图像资源的操作是没有输出内容的,其语法格式如下所示:

imagedestroy($image);

4. 绘制图像

1). 分配颜色 :
在真彩图片资源中,所有分配的颜色都不会自动给图片资源上色,是用来后续操作图片资源的时候指定着色的。但是如果当前使用的imagecreate创建的图片资源,那么第一个分配的颜色会自动被着色为图片背景色。需要注意的是,凡是给图片上增加内容,基本都要分配颜色(每一个操作图片的函数之前,都需要先调用分配颜色的函数得到一个颜色)

imagecolorallocate() 函数
imagecolorallocate() 函数可以为一个图像资源分配颜色,如果在图像中需要设置多种颜色,只要多次调用该函数即可。函数的语法格式如下所示:

 imagecolorallocate($image, $red, $green, $blue);

其中,$image 为要设置颜色的图像资源,imagecolorallocate() 函数会返回一个标识符,代表了由给定的 RGB 成分组成的颜色;$red,$green 和$blue 分别是所需要的颜色的红,绿,蓝成分,取值范围是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。

imagecolorallocatealpha() 函数
imagecolorallocatealpha() 函数的作用和 imagecolorallocate() 相同,但多了一个额外的设置透明度的参数 alpha,函数的语法格式如下:

imagecolorallocatealpha($image, $red, $green, $blue, $alpha);

其中,$image 为要设置颜色的图像资源;$red,$green 和 $blue 分别是所需要的颜色的红,绿,蓝成分,取值范围是 0 到 255 的整数或者十六进制的 0x00 到 0xFF;$alpha 用来设置颜色的透明的,取值范围在 0 到 127 之间,0 表示完全不透明,127 则表示完全透明。

2). 填充区域 :
区域填充不可以用来绘制图像,但它可以将一个已存在图像的颜色替换为其它颜色。在 PHP 中通过 imagefill() 函数来执行区域填充,它的语法格式如下所示:

imagefill($image, $x, $y, $color);

其中,$image 为创建的图像资源;$x 和 $y 为要设置颜色的横纵坐标;$color 为要设置的颜色。

imagefill()的填充逻辑:从指定点开始自动匹配相邻点,如果颜色一致,则自动渲染,扩展到全图。

3). 画点和直线 :
画点和线是绘制图像中最基本的操作,如果灵活使用,可以通过它们绘制出千变万化的图像。在 PHP 中,使用 imagesetpixel() 函数在画布中绘制一个单一像素的点,并且可以设置点的颜色,函数的语法格式如下:

imagesetpixel($image, $x, $y, $color);

该函数可以在第一个参数 $image 提供的画布中,在($x,$y)的坐标位置上,绘制一个颜色为 $color 的一个像素点。在实际开发中还可以通过循环和随机数的结合来绘制更多的像素点。

如果需要绘制一条线段,则可以使用 imageline() 函数,其语法格式如下:

imageline($image, $x1, $y1, $x2, $y2, $color);

我们都知道两个点可以确定一条线段,所以该函数可以在 $image 提供的画布中,从坐标($x1,$y1)到坐标($x2,$y2)绘制一条颜色为 $color 的线段。

4). 画矩形 :
在 PHP 中我们可以使用 imagerectangle() 或者 imagefilledrectangle() 函数来绘制一个矩形,与 imagerectangle() 函数不同的是 imagefilledrectangle() 函数会在绘制完成矩形后填充矩形,它们的语法格式如下所示:

imagerectangle($image, $x1, $y1, $x2, $y2, $color);  // $color是边线颜色imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);  // $color是矩阵填充色

这两个函数的功能类似,都是在 $image 画布中画一个矩形,矩形的左上角坐标为($x1,$y1),右下角坐标为($x2,$y2)。

5). 画多边形 :
在 PHP 中可以使用 imagepolygon() 函数来绘制一个多边形;也可以使用 imagefilledpolygon() 来绘制并填充一个多边形,它们的语法格式如下所示:

imagepolygon($image, $points, $num_points, $color);  // $color是边线颜色imagefilledpolygon($image, $points, $num_points, $color);  // $color是多边形填充色

这两个函数都是可以在画布$image 中画一个多边形;
第二个参数$points 是一个数组,包含了多边形的各个顶点坐标,例如 $points[0]=x0,$points[1]=y0,$points[2]=x1,$points[3]=y1,依此类推
第三个参数 $num_points 用来设置多边形的顶点数,必须大于 3
需要注意的是,$points 数组中的顶点坐标数(坐标是成对出现的)不得小于多边形的顶点数 $num_points。

6). 画圆弧 :
在 PHP 中可以使用 imagearc() 函数来画出一条弧线或者圆形,也可以使用 imagefilledarc() 函数来绘制弧线或者圆形并填充,它们的语法格式如下所示:

imagearc($image, $cx, $cy, $width, $height, $start, $end, $color);imagefilledarc($image, $cx, $cy, $width, $height, $start, $end, $color, $style);

这两个函数都可以在画布 $image 上绘制一个椭圆弧,其中 $cx 和 $cy 分别为圆弧中心点的横纵坐标;$width 和 $height 分别为圆弧的宽度和高度;$start 和 $end 分别代表圆弧的起点角度和终点角度,0° 为钟表 3 点钟的位置,以顺时针方向递增;至于 $color 参数,imagearc() 用来表示圆弧的线条颜色,而 imagefilledarc() 用来表示弧线区域的填充色;

imagefilledarc() 函数比 imagearc() 函数多了一个 $style 参数,它用来设置颜色的填充类型,可以是如下的值:

  • IMG_ARC_PIE:普通填充,产生圆形边界;
  • IMG_ARC_CHORD:只使用直线连接起点和终点,与 IMG_ARC_PIE 互斥;
  • IMG_ARC_NOFILL:指明弧或弦只有轮廓,不填充;
  • IMG_ARC_EDGED:用直线将起始和结束点与中心点相连,和 IMG_ARC_NOFILL 一起使用是画饼状图轮廓的好方法。

7). 在画布上写字 :
想要在图像中显示文字也需要按坐标位置画上去。在 PHP 中不仅支持多种的字体库,还提供了非常灵活的文字绘制方法。例如,在图像中绘制缩放、倾斜、旋转的文字等。常用的绘制文字的函数如下表所示:

函数名  描述
imagestring() 水平绘制一行字符串
imagestringup() 垂直绘制一行字符串
imagechar() 水平绘制一个字符
imagecharup() 垂直绘制一个字符
imagettftext() 用 TrueType 字体向图像中写入文本

虽然这几个函数的功能有所差异,但调用方式是类似的,尤其是 imagestring()、imagestringup()、imagechar() 以及 imagecharup() 函数,它们的参数都是相同的,因此就不再分开介绍了,这些函数的语法格式如下:

imagestring($image, $font, $x, $y, $s, $color);imagestringup($image, $font, $x, $y, $s, $col);imagechar($image, $font, $x, $y, $c, $color);imagecharup($image, $font, $x, $y, $c, $color);

使用这些函数可以在画布 $image 上,坐标为($x,$y)的位置,绘制字符串(或字符)$s,字符串的颜色为 $color,字体为 $font。如果 $font 是 1,2,3,4 或 5,则使用内置字体。

而imagettftext需要特殊说明:它可以使用 TrueType 字体(Windows 系统中扩展名为 .ttf 格式的字体)向图像中写入文本。

语法格式如下:

imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text)

参数说明如下:

  • $image:由图像创建函数(例如 imagecreatetruecolor())返回的图像资源;
  • $size:字体的尺寸;
  • $angle:角度制表示的角度,0 度为从左向右读的文本,数值越高则表示将文本进行逆时针旋转。例如 90 度表示从下向上读的文本;
  • $x、$y:表示文本中第一个字符的坐标点(大概是字符左下角的位置);
  • $color:用来设置文本的颜色;
  • $fontfile:是要使用的 TrueType 字体文件的路径;
  • $text:UTF-8 编码的文本字符串。

三:获得图片信息

1). 获得图片尺寸

getimagesize($image);

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

2). 获得画布尺寸

imagex($image);  // 获得图片宽度,单位为像素imagey($image);  // 获得图片高度,单位为像素

实例:

<?php
// 定义图片
$image = 'https://www.runoob.com/images/pulpit.jpg';// 获得图片全部信息
echo '<pre>';
$info = getimagesize($image);
var_dump($info);// 打开图片资源
$img = imagecreatefromjpeg($image);// 获得图片长宽信息
echo imagesx($img) . '<br>';
echo imagesy($img) . '<br>';


getimagesize($image)内容解读:

array(7) {[0]=>int(304)[1]=>int(228)[2]=>int(2)[3]=>string(24) "width="304" height="228""["bits"]=>int(8)["channels"]=>int(3)["mime"]=>string(10) "image/jpeg"
}
  • array(0): int型图片宽度

  • array(1): int型图片高度

  • array(2): 图像类型的标记:1 = GIF,2 = JPG,3 =PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 =TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 =JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。这些标记与 PHP 4.3.0 新加的 IMAGETYPE 常量对应。

  • array(3): 文本字符串,内容为"height=“yyy"width=“xxx””,可直接用于 IMG 标记。

  • array(“bits”):代表每种颜色的位数。

  • array(“channels”) :代表图片色系,对于 RGB 图像其值为 3,对于 CMYK 图像其值为 4

  • array(“mime”) :自 PHP 4.3.0 起被引入,代表符合该图像的 MIME 类型。此信息可以用来在 HTTP Content-type 头信息中发送正确的信息。

对于GD库的实际运用,我还写了三篇博客,有兴趣可以看看:
GD图像处理——验证码处理
GD图像处理——水印图实现
GD图像处理——缩略图的实现

更多内容大家可以前往我的个人博客浏览:eyes++的个人空间

PHP之GD图像处理相关推荐

  1. 【庖丁解牛】图像处理库: 解决WeCenter至少需要有GD图像处理库才能正常运行

    错误复现 以下是安装wecenter时候的报错信息: zmedu 致码高胜寒 解决方案一 [root@xinsz08 install]# yum install php-mysqlnd 解决方案二 如 ...

  2. 手动配置apache php,windows下手动搭建apache和php环境

    首先在apache和PHP官方网站上下载安装包  Apache提供了windows安装包双击运行安装就可以了.至于php可以下载windows的zip就可以了. 下载好了安装包以后首先是安装apach ...

  3. php变量在html调用函数调用,PHP_如何在html标记中调用的函数里传递对象,最近使用jquery结合Ajax开发一个 - phpStudy...

    如何在html标记中调用的函数里传递对象 最近使用jquery结合Ajax开发一个中小型网站应用.在后台管理中要使用Ajax调用系统功能,根据Ajax的返回结果,使用jQuery对前台页面进行操作. ...

  4. 【学习笔记】PHP进阶

    文章目录 表单传值 概念 为什么使用表单传值 表单传值方式 GET传值 POST传值 GET传值和POST传值的区别 PHP接收数据的三种方式 PHP处理复选框数据 复选框单项的命名方式 单选按钮的数 ...

  5. php工程师成长资料

    想成为一名php工程师的知识宝典 1.不知道找哪些视频来看,因为网上很多视频内容陈旧.过时,甚至错误: 2.视频不系统,很容易被网上各种各样的学习视频和资料误导而学到一些很乱很杂的东西,从而走很多弯路 ...

  6. 使用 ImageMagick 制作电影海报封面效果的照片

    <ZIPPER 拉链>电影海报 昨天因为偶然的原因看到电影<ZIPPER 拉链>的封面图片,超喜欢这种有颗粒感的照片.其实小林的微信头像也是类似颗粒感(或称像素.点阵)效果的单 ...

  7. 自学PHP的正确方法与经验

    我是2015年开始接触认识到PHP编程方面的知识,2012年我还是一名刚毕业的大学生开始踏入社会从事自己一份学校推荐的自动化职业,自动化工作枯燥无味,每天基本上3点一线,食堂-公司机器-宿舍,做了3年 ...

  8. php学习笔记——学习路线图记录

    PHP学习路线图 最全PHP自学指南 W3Cschool小编 2018-04-24 15:23:51 浏览数 (5381) 分享 收录专辑 对于广大零基础的PHP自学者,往往不知道如何系统的学习PHP ...

  9. 【linux】在阿里云服务器上部署网站 WeCenter

    文章目录 前言 操作环境及以有的架构 上传WeCenter软件包 解压并传至根目录 安装weCenter 1. 进入阿里云后台,选择域名 解析二级域名 bbs.zmkjedu.com 3. 设置apa ...

  10. 基于感知哈希算法的中药标本相似图片的搜索

    一 前言 笔者最近在开发中药标本相似图片的搜索,就是根据用户上传的图片,然后到中药标本库里找到相似的图片,从而帮助用户识别标本,获取标本信息.查阅了大量资料,看到了阮一峰的一篇文章,经过一个月的开发终 ...

最新文章

  1. Java面试题技术类一
  2. 目前对Learning to Rank 最全面的总结
  3. iOS之深入解析dyld与ObjC关联的底层原理
  4. python可视化报表制作教程_如何使用Python快速制作可视化报表
  5. 485串口测试工具软件_(案例)电脑和仪表之间485通讯的奇怪现象及解决方案
  6. 零基础学python-5.6 数字位操作与其它工具
  7. [洛谷U22157]刷水题(数位dp)(hash)
  8. Java(随笔)——利用HTML,CSS,JavaScript,JQuery编写的简易计算器
  9. 【Hoxton.SR1版本】Spring Cloud Gateway之GlobalFilter全局过滤器
  10. Hibernate简介与运行原理
  11. 计算机毕业设计之微信小程序的点餐系统 网上订餐app的论文
  12. Excel学习笔记:P1-Excel入门
  13. java 代码实现加锁_java内置锁实现锁住代码块方案(同一个对象或锁住整个类.class)...
  14. 异常:org.hibernate.cache.NoCachingEnabledException: Second-level cache is not enabled for usage [hiber
  15. 联想拯救者r720适合java么_这次绝无短板!4GB显存版联想游戏本拯救者R720入手实测...
  16. QTableWidget表格控件的用法
  17. 分享99个ASP电子商务源码,总有一款适合您
  18. (原)神卓互联内网穿透远程桌面方法
  19. Android获取网络视频文件缩略图
  20. ARP实验(ARP请求、回应包结构与ARP代理配置)

热门文章

  1. 使用dos2unix批量转换文件
  2. 看一遍就能玩转QT字体类(1)-QFont
  3. 缺少vclie60.bpl的解决方法
  4. Android HTTPS 抓包
  5. jquery html 兼容ie8,IE浏览器 对 jquery版本的兼容性 支持
  6. CDA的考试体系与人才能力模型
  7. 数据包络(DEA)分析法python实现
  8. 创造生命奇迹的幸存者
  9. 阿里maven仓库地址
  10. 有人一起用沙雕情侣头像吗?