零点起飞学PHP之图像处理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.获取图像的尺寸
1.获取图像的尺寸
【示例10-7】演示使用imagesx和imagesy函数获取图像的宽度和高度。运行结果就输出了图像的大小信息。下面我们再来使用getimagesize函数获取图像文件的信息。【示例10-8】演示使用getimagesize函数获图像文件的信息。注意:getimagesize函数会直接获取图像文件的信息,无需使用打开的文件资源。从运行结果中我们可以看到getimagesize函数返回的数组信息,我们依次来介绍各个数组元素表示的信息:元素0:表示图像文件的宽度;元素1:表示图像文件的高度;元素2:表示图像文件的格式。可能值为1~16,主要的值有:1为GIF格式(.gif)、2为JPEG/JPG格式(.jpeg/.jpg)、3为PNG格式(.png);元素3:表示图像文件的宽度和高度,可以用于HTML标签的参数;元素bits:表示每种颜色的位数;元素mime:表示图像的MIME类型。
5.绘制椭圆
6绘制弧线
绘制弧线对应的两个函数为imagearc和imagefilledarc函数。imagearc函数用来绘制弧线,imagefilledarc函数用来绘制弧线并填充。imagearc和imagefilledarc函数的原型如下:bool imagearc ( resource $image , int $cx , int $cy , int $w , int $h , int $s , int $e , int $color )bool imagefilledarc ( resource $image , int $cx , int $cy , int $w , int $h , int $s , int $e , int $color , int $style )参数image即为打开的图像资源;参数cx和cy用来规定弧线的圆心;参数w用来规定弧线的宽度;参数h用来规定弧线的高度;参数s用来规定弧线的开始角度;参数e用来规定弧线的结束角度。imagearc函数的color参数用来规定弧线的颜色。imagearc用来规定对圆弧区域的填充色;参数style用来规定填充和绘制的风格,可选的参数及说明如下:IMG_ARC_PIE:产生圆形边界;IMG_ARC_CHORD:用直线连接起始和结束点并填充到圆心的区域;IMG_ARC_NOFILL:弧或弦只有轮廓,不填充;IMG_ARC_EDGED:直线将起始和结束点与中心点相连。以上这些参数可以使用按位或组合起来实现多个效果。
extension=php_gd2.dll
我们需要做的就是将其前面的注释符号(;)去掉即可,然后重启服务器即可正确加载。当然由于我们使用的是集成开发环境,该扩展库已经默认被加载了。我们可以通过phpinfo或者gd_info函数来获取当前使用的GD库信息。
加载GD库
【示例10-1】以下代码演示使用gd_info函数获取当前GD库的信息。
参数image为打开的图像资源;参数x1和y1分别为直线开始的横纵坐标;参数x2和y2分别为直线结束的横纵坐标;参数color为直线的颜色。
2.绘制直线
215】演示使用imagerectangle函数绘制一个矩形。
01
从运行结果中我们可以看到该函数画出了一个矩形框。我们还可以使用imagesetthickness函数来设置画线的宽度,它的原型如下:
【示例10-6】演示使用imagecolorallocatealpha函数设置颜色透明度。
为了便于演示效果,我们将透明度设置得比较高。从该示例的运行结果我们可以明显看到相对于不透明的黑色要浅很多。
定义颜色
10.2.3 获取图像信息
图像最直观的信息有宽和高。图像的其他信息主要由图像的类型以及Exif信息。下面我们就来介绍获取这些信息的函数。
第10章 图像处理
PHP不仅可以用来处理文字,而且支持很多种图像格式的处理。我们不仅可以处理已经存在的图片,而且可以自己画出一幅图。在网站中,有大量的图片需要由网站动态生成,如验证码图片,水印图片。PHP提供了GD库,可以很轻松实现这些功能。本章将详细讲解图像绘制以及简易图片处理的知识。
10.1 处理图像前的准备
10.2.1 输出图像的三个步骤
同现实中绘画类似,在绘画之前需要有一张“画布”然后我们在上面作画。在编程中,图像的输出通常需要四个步骤,分别为——创建画布、绘制图像、输出图像和清除图像。下面我们就首先介绍绘制图像之外的三个步骤。
1.创建空画布
PHP中创建画空白布使用imagecreate和imagecreatetruecolor来创建,这两个函数的区别是imagecreate函数会创建一个基于调色板的图像,可以显示的色彩数通常为256色;而imagecreatetruecolor函数会创建一个真彩色的图像,通常可以显示16777216种颜色,官方推荐使用imagecreatetruecolor函数。但是imagecreatetruecolor函数不支持GIF格式的图像。这两个函数的原型如下:resource imagecreate ( int $x_size , int $y_size )resource imagecreatetruecolor ( int $x_size , int $y_size )参数x_size即为需要创建的画布的宽度;参数y_size为需要创建的画布的高度。这两个函数会返回一个资源以供后续的操作使用。注意:虽然imagecreate和imagecreatetruecolor函数都会创建一个空画布,但是默认情况下imagecreate函数会创建一个空白的画布,而imagecreatetruecolor则会创建出一个黑色的画布。
从运行结果我们可以看出,该函数返回的数组显示了已经加载的GD版本以及对图像格式的支持情况。如果GD库没有被正确加载是不会出现这些信息的。读者可以以此来判断GD库的加载情况。
1
2
加载GD库
指定正确的MIME类型
指定正确的MIME类型
例如,我们可以使用如下的代码让浏览器来以png格式的要求解析请求:header(‘Content-Type:image/png’)需要注意的是在设置的头文件输出前不可以有任何字符的输出否则会导致图像无法显示。
一般在电脑中绘制椭圆时,认为椭圆是与相对应的矩形相切的,矩形的长即为椭圆的长轴的长度,矩形的宽即为椭圆的短轴长度。所以通过矩形可以更好的理解椭圆的绘制,确定了矩形的位置及大小就可以确定椭圆的位置及大小。在不使用半径的情况下,在一个矩形的区域中想要定位一个椭圆就是比较使初学者困惑的。例如很多想要完成一个如图所示的图像并不会非常容易。
bool imagesetpixel ( resource $image , int $x , int $y , int $color )
参数image即为打开的图像资源;参数x和y分别为像素点的横坐标和纵坐标;参数color为像素点的颜色。为了使绘制效果更佳明显,我们会使用imagefill函数将背景填充为白色。
4.清除图像资源
6
4.清除图像资源
1
2
3
4
5
定义颜色
【示例10-5】演示使用imagecolorallocate函数为imagecreate函数创建的画布设置背景色。
从图中我们可以看到,基于调色板的画布被设置成为了黑色背景。下面我们再来演示使用imagecolorallocatealpha函数为颜色设置透明度。
02
bool imagesetthickness ( resource $image , int $thickness )
03
参数image为打开的图像资源;参数thickness为需要设置的画线的宽度。
04
3.绘制矩形
06
3.绘制矩形
6
3.绘制矩形
06
4.绘制多边形
【示例10-20】演示使用imagepolygon函数和imagefilledpolygon函数绘制多边形。
1.图像坐标
通常情况下图像的坐标系统与我们数学中使用的坐标系统是不同的。图像的坐标系统如图所示。
01
02
图片尺寸通常使用像素来表示,单位为px。假设我们上面的定义的图片为200*300像素。那么它的宽度就是200px,高度就是300px。那么它的一些常用的坐标如图10.3所示。
在进行简单绘画的时候,坐标的掌握是非常重要的。只有非常熟练地掌握坐标系统,才能画出自己满意的效果。
检查图像是否为真彩色图像需要使用的函数是imageistruecolor,它的原型如下:
bool imageistruecolor ( resource $image )
参数image为打开的图像资源。该函数的使用和理解都比较简单这里就不详细介绍。
2.检查图像是否为真彩色图像
01
03
02
3.获取图像的Exif信息
图像类型
MIME表示
JPEG文件可交换格式(.jpeg/.jpg)
image/jpeg
可移植网络图像(.png)
image/png
可交换图像格式(.gif)
image/gif
Windows位图(.bmp)
image/bmp
10.1.3 通用图像知识
在图像处理的过程中,坐标系统占有非常重要的地位,如果不能熟练的掌握坐标系统,那么在使用图像处理函数的时候会非常吃力。
色彩
RGB值
白色
(255,255,255)或者“#FFFFFF”
黑色
(0,0,0)或者“#000000”
红色
(255,0,0)或者“#FF0000”
绿色
(0,255,0)或者“#00FF00”
蓝色
(0,0,255)或者“#0000FF”
10.2 图像绘制
经过上一小节的学习,基础的准备工作我们已经介绍完毕了。接下来就回到我们PHP知识的学习中。本小节将会从创建画布开始介绍图像绘制的所有步骤。
1.图像坐标
角度在图形图像处理中常用在画弧线或者旋转图像之用。在编程领域通常使用的角度系统如图所示。
01
也就是说,0°在3点钟的位置,角度依次按照顺时针方向增加。
02
2.角度系统
3.绘制椭圆
在绘制椭圆的时候不存在半径参数。因此我们也需要了解一下画椭圆时候需要使用到参数。它的形式如图所示。
3.绘制椭圆
3.获取图像的Exif信息
【示例10-9】演示使用exif_read_data函数获取图像的相关信息。
绘制图形
绘制图形是我们本章学习的重点,只要熟练掌握了绘制图形的知识,那么关于图像处理的其他的知识都会很容易就掌握。当然绘制图形可能参数比较多,但是学习起来还是非常有趣的。
在图像处理中,PHP可以处理的最小单位就是像素点。画一个像素点使用的函数是imagesetpixel函数,它的原型如下:
2.创建基于文件或URL的画布
04
3.输出图像
03
02
01
在图像输出后,就需要清除图像来释放资源,就类似于关闭文件句柄。清除图像使用的函数为imagedestroy,它的原型如下:
bool imagedestroy ( resource $image )
参数image即为创建画布函数返回的资源。下面我们就来演示从创建画布到清除图像的整个流程以及执行的效果。
在进行本节知识的讲解前,读者需要做一些必要的环境配置以及通用的图像知识,例如图像中的坐标系统等。读者只有配置好环境,以及了解必要的图像知识后,才可以轻松地理解和使用图像绘制相关的函数。
GD库是PHP的图形扩展库。所谓扩展就是非必须的,PHP不使用它也不会出现问题,但是使用它可以使一些工作更加容易。例如我们的图像处理。GD库已经成为PHP默认安装的库,省去了我们进行安装。但是默认情况下GD库是没有加载的,我们需要通过配置PHP配置文件来加载。需要修改php.ini文件的如下设置:
1.绘制像素点
1
2
3
4
5
6
1.绘制像素点
在示例10-11中我们使用像素点连起来画出了一条直线。在PHP提供了专门的imageline函数来画出一条直线,该函数的原型如下:
bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
3.绘制椭圆
想要画出图中所示的图像的难点就在于椭圆圆心的确定。因此以上介绍的这些知识都是有相当必要去掌握的。
4.RGB色彩模式
在图像处理的过程中我们主要使用的色彩模式为RGB模式。RGB即分别代表红(red)、绿(green)和蓝(blue)三种颜色。这种模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。也就是说我们需要分别指定这三种颜色在一个像素点中的值。这些值可以为0~255中的一个或者其十六进制表示,如表所示。
01
在运行结果中,六边形是使用imagepolygon函数绘制的,其中的黑色部分的四边形是使用imagefilledpolygon函数绘制并填充的。
02
4.绘制多边形
5.绘制椭圆
01
02
【示例10-21】演示使用imageellipse和imagefilledellipse函数绘制椭圆。
运行结果中宽度较大的椭圆为使用imageellipse函数绘制的黑色线条椭圆;高度较大的椭圆为使用imagefilledellipse函数使用黑色填充的椭圆。由于正圆是一种特殊的椭圆,因此使用imageellipse和imagefilledellipse函数同样可以用来绘制正圆。