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:image/png”,表示浏览器将输出PNG格式的图片。如果在程序中输出文本信息,则在浏览器中不会显示。
1.创建背景图形
创建背景可以使用imagecreate()和imagecreatetruecoloc()函数,这两个函数都可以创建一个空白的图形,并返回一个图像标志符,供其它函数使用。
resource imagecreate(int $x_size,int $y_size)
resource imagecreatetruecolor(int $x_size,int $y_size)
$x_size是背景的宽度,$y_size是背景的高度,imagecreate()函数用于建立一个基于调色板的图形,创建后可改变背景颜色。imagecreatetruecolor()函数用于创建一个真彩色图形,背景颜色默认为黑色。如果创建成功,函数将返回一个句柄,如果失败,并不会像其他函数一样返回FALSE,这时可以使用die()函数来捕获错误信息。类似imagecreate()的函数都可以使用die()函数来捕获错误信息。
背景创建之后,就可以使用图形函数在背景中绘制图形或输入文本。
2.使用已有图片创建新图形
imagecreatefromfig()函数可以根据已有的GIF图形创建新图形,imagecreatefromjpeg()函数可以根据已有的JPEG图片创建新图形,imagecreatefrompng()函数可以根据已有的PNG图片创建新图形。已有的图片可以是远程的图片文件。
使用这些函数后已有的图片将作为新图形的背景,之后的操作和imagecreate()函数创建背景图形的操作方法一样。
3.选择颜色
颜色值得选择需要使用imagecolorallocate()函数来完成。
int imagecolorallocate(resource $image,int $red,int $green,int $blue)
imagecolorallocate()函数返回一个标志符,代表了由给定的红、绿、蓝(RBG)值组成的颜色。$red、$green、$blue分别是所需要的颜色的红、绿、蓝成分。这些参数是0~255的整数或者是十六进制的0x00~0xFF。imagecolorallocate()函数必须被调用以创建每一种用在$image所代表的图形中的颜色。黑色(0,0,0)、红色(255,0,0)、蓝色(0,0,255)、白色(255,255,255)、绿色(0,255,0)。
4.输出图形
使用imagegif()函数可以将图形以GIF格式输出到浏览器或文件,image‘jpeg()将图形以JPEG格式输出,imagepng()函数将图形以PNG格式输出。
bool imagepng(resource $image[,string $filename])
bool imagegif(resource $image[,string $filename])
bool imagejpeg(resource $image[,string $filename[,int $quality]])
$image是已经创建的图像句柄,如果不提供参数$filename,则直接输出原始图形。如果提供参数$filename,则以$filename为文件名创建一个相应格式的图片,保存以后Web页面中就可以使用该图片了。imagejpeg()函数中的可选参数$quality,范围从0(最差质量,文件最小)到100(最佳质量,文件最大).
不管输出什么格式的图片,都要使用header()函数向浏览器发送相应的头信息。如果要输出GIF格式的图片应使用:“header("Content-type:image/gif");”;输出JPEG格式的图片应使用“header("Content-type:image/jpeg");”;PNG格式使用“header("Content-type:image/png");”。
5.清除资源
为了节省资源,图片创建后返回的句柄如果不再使用,就要用imagedestory()函数来释放与之相关的内存。
二、绘制图形
1.绘制几何图形
(1)画一个点
使用imagesetpixel()函数就可以在已经创建的背景图形上画一个单一像素,即一个点。
bool imagesetpixel(resource $image,int $x,int $y, int $color)
imagesetpixel()函数在已经创建的图形$image上用$color颜色在($x,$y)坐标上画一个点。起始坐标从左上角开始,坐标为(0,0),到右下角的坐标为($x_size,$y_size),其中$x_size和$y_size是背景图形的宽和高。
(2)画一条线段
使用imageline()函数可以画出一条线段。
bool imageline(resource $image ,int $x1 ,$int $y1, int $x2, int $y2,int $color)
imageline()函数可以在已经创建的图形$image上使用$color颜色画出一条坐标从($x1,$y1)到($x2,$y2)的线段。
(3)画一个矩形
绘制矩形可以使用imagerectangle()函数来完成。
bool imagerectangle(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)
imagerectangle()函数在已经创建的图形$image上使用$color颜色画出一个矩形,矩形的左上角坐标为($x1,$y1),右上角坐标为($x2,$y2)。
(4)画一个椭圆
使用imageellipse()函数可以画一个椭圆。
bool imageellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color)
imageellipse()函数在图形$image上画一个中心坐标为($cx,$cy)的椭圆。$w和$h分别指定了椭圆的宽度和高度,椭圆线条的颜色由$color指定。当椭圆的宽度和高度相等时,画出的将是一个圆。
(5)画一个椭圆弧
创建一个椭圆弧可以使用imagearc()函数
bool imagearc(resource $image,int $cx,int $cy,int $w,int $h,int $s,int $e, int $color)
imagearc()函数以坐标($cx,$cy)为中心在图形$image上画一个椭圆弧。$w和$h分别指定了椭圆的宽度和高度,当宽度和高度相等时,画出来的就是圆弧。起始和结束点用$s和$e参数以角度指定。0度位于三点钟位置,以顺时针方向绘画。
(6)画一个多边形
使用imagepolygon()函数可以画出一个多边形。
bool imagepolygon(resource $image,array $points,int $num_points,int $color)
imagepolygon()函数在$image中创建一个多边形。$points是一个PHP数组,包含了多边形的各个顶点坐标。即$points[0]=x0,$points[1]=y0,$points[2]=x1,$points[3]=y1,以此类推。$num_points是顶点的总数。
2.输出文本
(1)输出一个字符
使用imagechar()函数可以在图形上水平输出一个字符。
bool imagechar(resource $image,int $font,int $x,int $y,string $c,int $colot)
函数用颜色$color将字符$c画到$image的($x,$y)坐标处(这是字符串左上角坐标)。如果$c是一个字符串,则只输出第一个字符。$font表示字符串的字体,如果值为1~5中的一个数,则使用内置字体,值为5时字体最大,为1时最小。
imageup()函数可以垂直地输出一个字符,用法与imagechar()函数相同。
(2)输出字符串
使用imagestring()函数可以在已经创建的背景图形上输出字符串
bool imagestring(resource $image,int $font,int $x,int $y,string $s ,int $color)
函数用颜色$color将字符串$s画到$image的($x,$y)坐标处。
imagestringup()函数可以垂直地输出字符串,用法与imagestring()函数相同.
imagestring()函数不支持中文显示。
(3)使用指定字体输出字符串
使用imagettftext()函数可以在输出字符的同时指定输出字符所使用的字体,并根据参数的不同输出不同角度的字符串。
array imagettftext(resource $image,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text)
本函数使用颜色$color将字符串$text输出到$image图形的($x,$y)坐标上,函数还可以使用$size参数指定字体的大小,使用$angle参数指定字体的角度,水平时角度为0,沿逆时针变大。使用$fontfile参数指定想要使用的TrueType的字体文件,该文件必须是一个有效的字体文件,否则运行时会产生错误。
在Windows平台下,字体文件全部位于C:\\Windows\Fonts目录中,使用时可以将需要的字体文件复制到工作目录中,或者直接指定字体文件的位置。
(4)输出中文文字
中文字符不可以使用imagettftext()函数在图片中直接输出,如果要输出中文字符,需要先使用iconv()函数对中文字符进行编码。
string iconv(string $in_charset,string $out_charset,string $str)
参数$in_chatset是中文字符原来的字符集,$out_charset是编码后的字符集,$str是需要转换的中文字符串。函数最后返回编码后的字符串。这是使用imagettftext()函数就可以在图片中输出中文了。
3.绘制带填充色的几何图形
在PHP中可以使用imagefill()函数对某一区域进行颜色填充。
bool imagefill(resource $image,int $x,int $y,int $color)
函数在$image图形的坐标($x,$y)处用颜色$color执行区域填充,即与($x,$y)点颜色相同且相邻的点都会被填充上该颜色。
推荐使用imagecreatecolor()函数来创建图形。
使用imagefill()函数填充颜色时要计算填充点,这是一件很麻烦的事。PHP可以在画几何图形的时候就将几何图形填充为指定颜色。
(1)画一个矩形并填充
使用imagefilledrectangle()函数可以画一个矩形,并使用指定颜色填充该矩形。
bool imagefilledrectangle(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)
imagefilledrectangle()函数的$color参数指定的是整个矩形区域的颜色。
函数imagefilledpolygon()可以画一个多边形并填充颜色。
(2)画一个椭圆并填色
使用imagefilledellipse()函数可以在已经创建的图形上画一个椭圆,并使用指定颜色进行填充。
bool imagefilledellipse(resource $image, int $cx ,int $cy,int $w,int $h, int $color)
(3)画一个椭圆弧并填色
函数imagefilledarc()函数可以画一个椭圆弧并填充颜色。
bool imagefilledarc(resource $image,int $cx,int $cy,int $w,int $h,int $s,int $e,int $color,int $style)
在$image中以坐标($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)指定颜色填充
使用imagefilltoborder()函数可以为指定点进行颜色填充,如果遇到指定颜色的边界时,则停止填充。
bool imagefilltoborder(resource $image,int $x,int $y,int $border,int $color)
该函数从坐标($x,$y)开始用$color颜色执行区域填充,知道碰到颜色为$border的边界为止。边界内的所有颜色都会被填充。
如果指定的边界色和该点颜色相同,则没有填充。如果图像中没有该边界色,则整幅图像都会被填充。
(2)定义透明色
使用imagecolorallocatealpha()函数也可以为指定的图形分配颜色,还可以设置颜色的透明度。
int imagecolorallocatealpha(resource $image, int $red,int $green,int $blue,int $alpha)
$alpha参数用于设置颜色的透明度,其值从0到127。0表示完全不透明,127表示完全透明。
2.复制图片的一部分
使用imagecopy()函数能够复制图片的一部分到另一个图片。
bool imagecopy(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.复制图片并调整大小
使用imagecopyresized()函数也可以实现imagecopy()函数的功能,并可以对复制的图片大小进行调整。
bool imagecopyresized(resource $dst_image,resource $src_image,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,即实现了图片的缩放功能。
imagesx()和imagesy()函数的作用是获取一个图像的宽度和高度,他们的参数是已经创建的图像句柄。
4.旋转图像
使用imagerotate()函数可以将图像旋转给定角度
resource imagerotate(resource $src_im,float $angle,int $bgd_color[,int $ignore_transparent])
参数$src_im是给定的图像,$angle是指定的旋转角度,$bgd_color指定了旋转后没有覆盖到的部分的颜色。旋转的中心是图像的中心,旋转后的图像会按比例缩小以适合目标图像的大小,边缘不会被剪去。可选参数$ignore_transparent若被设为非零值,则透明色会被忽略(否则会被保留)。
四、其他的图形函数
1.取得图形信息
getimagesize()函数可以获取指定图形的尺寸、宽度、高度和类型等信息。该函数将这些信息以数组的形式返回,如果图片指定的图形不是有效的文件,则返回FALSE。
2.设定画线
使用imagesetthickness()函数可以设置画几何图形时画线的宽度。
bool imagesetthickness(resource $image,int $thickness)
该函数将画线宽度设为$thickness个像素。