PHP图形处理相关函数举例

在PHP中有的图形函数可以直接使用,但大多数函数需要安装GD2函数库才能使用。在Windows平台下,安装GD2库很简单,PHP5中自带了GD2库扩展(就是PHP的ext目录下的php_gd2.dll文件)。运行phpinfo()页面查看是否有GD的部分,如果有,说明已经安装了GD2库,如果没有,说明安装PHP时没有安装GD2库。打开php.ini文件,查看文件中是否有一句“;extension=php_gd2.dll”,如果有则将其中的“;”去掉,再打开文件扩展目录extension_dir的值设置成PHP的ext目录所在的完整路径,保存后重启Apache即可。

PHP所能处理的图像格式取决于所安装的GD版本,以及其他GD可能用到的来访问这些图像格式的库。低于gd-1.6版本的GD支持GIF格式,不支持PNG,高于gd-1.6低于gd-2.0.28的版本支持PNG,不支持GIF。在gd-2.0.28中又重新支持GIF。

目前的GD2库支持JPEG、PNG、GIF、WBMP等文件格式。JPEG通常用来存储照片或者具有丰富色彩和色彩层次的图像,这种格式使用了有损压缩,图像质量有所破坏,由于这个原因,该格式不适合绘制线条、文本或颜色块。GIF是图形文件交换格式,广泛应用于网络,适合存储包含文本、线条和简单颜色块的图像。PNG是可移植的网络图像,该嘎是是无损压缩,所以适合直线、文本或简单颜色块的图像,由于GIF的专利原因,PNG在一段时间内是作为GIF的替代品使用的。WBMP是专门为无限通信设备设置的文件格式,但是没有得到广泛的发展。

一、创建图形

在PHP中创建图形的步骤有:创建一个背景、在背景中绘制图形或输入文本、输出图形、释放所有资源。

注意在使用PHP输出图形时,一定要使用header()函数向浏览器发送头信息,指定浏览器输出相应格式的文件。若头信息为“Content-type:p_w_picpath/png”,表示浏览器将输出PNG格式的图片。如果在程序中输出文本信息,则在浏览器中不会显示。

1.创建背景图形

创建背景可以使用p_w_picpathcreate()和p_w_picpathcreatetruecoloc()函数,这两个函数都可以创建一个空白的图形,并返回一个图像标志符,供其它函数使用。

resource p_w_picpathcreate(int $x_size,int $y_size)

resource p_w_picpathcreatetruecolor(int $x_size,int $y_size)

$x_size是背景的宽度,$y_size是背景的高度,p_w_picpathcreate()函数用于建立一个基于调色板的图形,创建后可改变背景颜色。p_w_picpathcreatetruecolor()函数用于创建一个真彩×××形,背景颜色默认为黑色。如果创建成功,函数将返回一个句柄,如果失败,并不会像其他函数一样返回FALSE,这时可以使用die()函数来捕获错误信息。类似p_w_picpathcreate()的函数都可以使用die()函数来捕获错误信息。

背景创建之后,就可以使用图形函数在背景中绘制图形或输入文本。

2.使用已有图片创建新图形

p_w_picpathcreatefromfig()函数可以根据已有的GIF图形创建新图形,p_w_picpathcreatefromjpeg()函数可以根据已有的JPEG图片创建新图形,p_w_picpathcreatefrompng()函数可以根据已有的PNG图片创建新图形。已有的图片可以是远程的图片文件。

使用这些函数后已有的图片将作为新图形的背景,之后的操作和p_w_picpathcreate()函数创建背景图形的操作方法一样。

3.选择颜色

颜色值得选择需要使用p_w_picpathcolorallocate()函数来完成。

int p_w_picpathcolorallocate(resource $p_w_picpath,int $red,int $green,int $blue)

p_w_picpathcolorallocate()函数返回一个标志符,代表了由给定的红、绿、蓝(RBG)值组成的颜色。$red、$green、$blue分别是所需要的颜色的红、绿、蓝成分。这些参数是0~255的整数或者是十六进制的0x00~0xFF。p_w_picpathcolorallocate()函数必须被调用以创建每一种用在$p_w_picpath所代表的图形中的颜色。黑色(0,0,0)、红色(255,0,0)、蓝色(0,0,255)、白色(255,255,255)、绿色(0,255,0)。

4.输出图形

使用p_w_picpathgif()函数可以将图形以GIF格式输出到浏览器或文件,p_w_picpath'jpeg()将图形以JPEG格式输出,p_w_picpathpng()函数将图形以PNG格式输出。

bool p_w_picpathpng(resource $p_w_picpath[,string $filename])

bool p_w_picpathgif(resource $p_w_picpath[,string $filename])

bool p_w_picpathjpeg(resource $p_w_picpath[,string $filename[,int $quality]])

$p_w_picpath是已经创建的图像句柄,如果不提供参数$filename,则直接输出原始图形。如果提供参数$filename,则以$filename为文件名创建一个相应格式的图片,保存以后Web页面中就可以使用该图片了。p_w_picpathjpeg()函数中的可选参数$quality,范围从0(最差质量,文件最小)到100(最佳质量,文件最大).

不管输出什么格式的图片,都要使用header()函数向浏览器发送相应的头信息。如果要输出GIF格式的图片应使用:“header("Content-type:p_w_picpath/gif");”;输出JPEG格式的图片应使用“header("Content-type:p_w_picpath/jpeg");”;PNG格式使用“header("Content-type:p_w_picpath/png");”。

5.清除资源

为了节省资源,图片创建后返回的句柄如果不再使用,就要用p_w_picpathdestory()函数来释放与之相关的内存。

二、绘制图形

1.绘制几何图形

(1)画一个点

使用p_w_picpathsetpixel()函数就可以在已经创建的背景图形上画一个单一像素,即一个点。

bool p_w_picpathsetpixel(resource $p_w_picpath,int $x,int $y, int $color)

p_w_picpathsetpixel()函数在已经创建的图形$p_w_picpath上用$color颜色在($x,$y)坐标上画一个点。起始坐标从左上角开始,坐标为(0,0),到右下角的坐标为($x_size,$y_size),其中$x_size和$y_size是背景图形的宽和高。

(2)画一条线段

使用p_w_picpathline()函数可以画出一条线段。

bool p_w_picpathline(resource $p_w_picpath ,int $x1 ,$int $y1, int $x2, int $y2,int $color)

p_w_picpathline()函数可以在已经创建的图形$p_w_picpath上使用$color颜色画出一条坐标从($x1,$y1)到($x2,$y2)的线段。

(3)画一个矩形

绘制矩形可以使用p_w_picpathrectangle()函数来完成。

bool p_w_picpathrectangle(resource $p_w_picpath,int $x1,int $y1,int $x2,int $y2,int $color)

p_w_picpathrectangle()函数在已经创建的图形$p_w_picpath上使用$color颜色画出一个矩形,矩形的左上角坐标为($x1,$y1),右上角坐标为($x2,$y2)。

(4)画一个椭圆

使用p_w_picpathellipse()函数可以画一个椭圆。

bool p_w_picpathellipse(resource $p_w_picpath,int $cx,int $cy,int $w,int $h,int $color)

p_w_picpathellipse()函数在图形$p_w_picpath上画一个中心坐标为($cx,$cy)的椭圆。$w和$h分别指定了椭圆的宽度和高度,椭圆线条的颜色由$color指定。当椭圆的宽度和高度相等时,画出的将是一个圆。

(5)画一个椭圆弧

创建一个椭圆弧可以使用p_w_picpatharc()函数

bool p_w_picpatharc(resource $p_w_picpath,int $cx,int $cy,int $w,int $h,int $s,int $e, int $color)

p_w_picpatharc()函数以坐标($cx,$cy)为中心在图形$p_w_picpath上画一个椭圆弧。$w和$h分别指定了椭圆的宽度和高度,当宽度和高度相等时,画出来的就是圆弧。起始和结束点用$s和$e参数以角度指定。0度位于三点钟位置,以顺时针方向绘画。

(6)画一个多边形

使用p_w_picpathpolygon()函数可以画出一个多边形。

bool p_w_picpathpolygon(resource $p_w_picpath,array $points,int $num_points,int $color)

p_w_picpathpolygon()函数在$p_w_picpath中创建一个多边形。$points是一个PHP数组,包含了多边形的各个顶点坐标。即$points[0]=x0,$points[1]=y0,$points[2]=x1,$points[3]=y1,以此类推。$num_points是顶点的总数。

2.输出文本

(1)输出一个字符

使用p_w_picpathchar()函数可以在图形上水平输出一个字符。

bool p_w_picpathchar(resource $p_w_picpath,int $font,int $x,int $y,string $c,int $colot)

函数用颜色$color将字符$c画到$p_w_picpath的($x,$y)坐标处(这是字符串左上角坐标)。如果$c是一个字符串,则只输出第一个字符。$font表示字符串的字体,如果值为1~5中的一个数,则使用内置字体,值为5时字体最大,为1时最小。

p_w_picpathup()函数可以垂直地输出一个字符,用法与p_w_picpathchar()函数相同。

(2)输出字符串

使用p_w_picpathstring()函数可以在已经创建的背景图形上输出字符串

bool p_w_picpathstring(resource $p_w_picpath,int $font,int $x,int $y,string $s ,int $color)

函数用颜色$color将字符串$s画到$p_w_picpath的($x,$y)坐标处。

p_w_picpathstringup()函数可以垂直地输出字符串,用法与p_w_picpathstring()函数相同.

p_w_picpathstring()函数不支持中文显示。

(3)使用指定字体输出字符串

使用p_w_picpathttftext()函数可以在输出字符的同时指定输出字符所使用的字体,并根据参数的不同输出不同角度的字符串。

array p_w_picpathttftext(resource $p_w_picpath,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text)

本函数使用颜色$color将字符串$text输出到$p_w_picpath图形的($x,$y)坐标上,函数还可以使用$size参数指定字体的大小,使用$angle参数指定字体的角度,水平时角度为0,沿逆时针变大。使用$fontfile参数指定想要使用的TrueType的字体文件,该文件必须是一个有效的字体文件,否则运行时会产生错误。

在Windows平台下,字体文件全部位于C:\\Windows\Fonts目录中,使用时可以将需要的字体文件复制到工作目录中,或者直接指定字体文件的位置。

(4)输出中文文字

中文字符不可以使用p_w_picpathttftext()函数在图片中直接输出,如果要输出中文字符,需要先使用iconv()函数对中文字符进行编码。

string iconv(string $in_charset,string $out_charset,string $str)

参数$in_chatset是中文字符原来的字符集,$out_charset是编码后的字符集,$str是需要转换的中文字符串。函数最后返回编码后的字符串。这是使用p_w_picpathttftext()函数就可以在图片中输出中文了。

3.绘制带填充色的几何图形

在PHP中可以使用p_w_picpathfill()函数对某一区域进行颜色填充。

bool p_w_picpathfill(resource $p_w_picpath,int $x,int $y,int $color)

函数在$p_w_picpath图形的坐标($x,$y)处用颜色$color执行区域填充,即与($x,$y)点颜色相同且相邻的点都会被填充上该颜色。

推荐使用p_w_picpathcreatecolor()函数来创建图形。

使用p_w_picpathfill()函数填充颜色时要计算填充点,这是一件很麻烦的事。PHP可以在画几何图形的时候就将几何图形填充为指定颜色。

(1)画一个矩形并填充

使用p_w_picpathfilledrectangle()函数可以画一个矩形,并使用指定颜色填充该矩形。

bool p_w_picpathfilledrectangle(resource $p_w_picpath,int $x1,int $y1,int $x2,int $y2,int $color)

p_w_picpathfilledrectangle()函数的$color参数指定的是整个矩形区域的颜色。

函数p_w_picpathfilledpolygon()可以画一个多边形并填充颜色。

(2)画一个椭圆并填色

使用p_w_picpathfilledellipse()函数可以在已经创建的图形上画一个椭圆,并使用指定颜色进行填充。

bool p_w_picpathfilledellipse(resource $p_w_picpath, int $cx ,int $cy,int $w,int $h, int $color)

(3)画一个椭圆弧并填色

函数p_w_picpathfilledarc()函数可以画一个椭圆弧并填充颜色。

bool p_w_picpathfilledarc(resource $p_w_picpath,int $cx,int $cy,int $w,int $h,int $s,int $e,int $color,int $style)

在$p_w_picpath中以坐标($cx,$cy)为中心画一个椭圆弧。如果成功则返回TRUE,失败则返回FALSE。$w和$h分别指定了椭圆的宽和高,$s和$e参数以角度指定了起始和结束点。$style指定了椭圆弧画出来的效果,值可以是以下几个:IMG_ARC_PIE(产生圆形边界)、IMG_ARC_CHORD(用直线连接起始和结束点)、IMG_ARC_NOFILL(指明弧或弦只有轮廓,不填充)和IMG_ARC_EDGED(用直线将起始和结束点与中心点相连)。$style的值可以一起使用,不过当IMG_ARC_PIE和IMG_ARC_CHORD一起使用时,只有IMG_ARC_CHORD将起作用。IMG_ARC_EDGED和IMG_ARC_NOFILL一起使用是画饼状图轮廓的好方法。

pi()函数的作用是返回圆周率的值,cos()函数和sin()函数的作用是返回一个弧度的余弦值和正弦值。number_format()函数的作用是格式化一个浮点数。

string number_format(float $number[,int $decimals[,string $dec_point[,string $thousands_sep]]])

参数$number是要格式化的浮点数:参数$decimals指定返回的小数的位数,若省略则只返回整数部分;$dec_point表示小数点的表示方式,默认值是“.”;参数$thousands_sep为整数部分每三位的分隔符号,默认值是“.”。

三、图形的处理

1.颜色处理

(1)指定颜色填充

使用p_w_picpathfilltoborder()函数可以为指定点进行颜色填充,如果遇到指定颜色的边界时,则停止填充。

bool p_w_picpathfilltoborder(resource $p_w_picpath,int $x,int $y,int $border,int $color)

该函数从坐标($x,$y)开始用$color颜色执行区域填充,知道碰到颜色为$border的边界为止。边界内的所有颜色都会被填充。

如果指定的边界色和该点颜色相同,则没有填充。如果图像中没有该边界色,则整幅图像都会被填充。

(2)定义透明色

使用p_w_picpathcolorallocatealpha()函数也可以为指定的图形分配颜色,还可以设置颜色的透明度。

int p_w_picpathcolorallocatealpha(resource $p_w_picpath, int $red,int $green,int $blue,int $alpha)

$alpha参数用于设置颜色的透明度,其值从0到127。0表示完全不透明,127表示完全透明。

2.复制图片的一部分

使用p_w_picpathcopy()函数能够复制图片的一部分到另一个图片。

bool p_w_picpathcopy(resource $dst_im,resource $src_im,int $dst_x,int $dst_y,int $src_x,int $src_y,int $src_w,int $src_h)

将$src_im中坐标从($src_x,$src_y)开始,宽度为$src_w,高度为$src_h的一部分复制到$dst_im中坐标为($dst_x,$dst_y)的位置上。

3.复制图片并调整大小

使用p_w_picpathcopyresized()函数也可以实现p_w_picpathcopy()函数的功能,并可以对复制的图片大小进行调整。

bool p_w_picpathcopyresized(resource $dst_p_w_picpath,resource $src_p_w_picpath,int $dst_x,int $dst_y,int $src_x,int $src_y,int $dst_w,int $dst_h,int $src_w,int $src_h)

$dst_w和$dst_h这两个参数表示将复制的图片宽度和高度分别调整为$dst_w和$dst_h,即实现了图片的缩放功能。

p_w_picpathsx()和p_w_picpathsy()函数的作用是获取一个图像的宽度和高度,他们的参数是已经创建的图像句柄。

4.旋转图像

使用p_w_picpathrotate()函数可以将图像旋转给定角度

resource p_w_picpathrotate(resource $src_im,float $angle,int $bgd_color[,int $ignore_transparent])

参数$src_im是给定的图像,$angle是指定的旋转角度,$bgd_color指定了旋转后没有覆盖到的部分的颜色。旋转的中心是图像的中心,旋转后的图像会按比例缩小以适合目标图像的大小,边缘不会被剪去。可选参数$ignore_transparent若被设为非零值,则透明色会被忽略(否则会被保留)。

四、其他的图形函数

1.取得图形信息

getp_w_picpathsize()函数可以获取指定图形的尺寸、宽度、高度和类型等信息。该函数将这些信息以数组的形式返回,如果图片指定的图形不是有效的文件,则返回FALSE。

2.设定画线

使用p_w_picpathsetthickness()函数可以设置画几何图形时画线的宽度。

bool p_w_picpathsetthickness(resource $p_w_picpath,int $thickness)

该函数将画线宽度设为$thickness个像素。