1、2022年12月5日星期一http:/ 图像的生成步骤图像的生成步骤 使用使用GD库函数绘制图像库函数绘制图像 GD库函数综合应用实例库函数综合应用实例 实例简单实例简单图像图像验证码的制作验证码的制作2022年12月5日星期一http:/ PHP 不仅限于只产生不仅限于只产生 HTML 的输出,还可以创的输出,还可以创建及操作多种不同格式的图像文件。建及操作多种不同格式的图像文件。PHP提供了一些提供了一些内置的图像信息函数,也可以使用内置的图像信息函数,也可以使用GD函数库创建新图函数库创建新图像或处理已有的图像。目前像或处理已有的图像。目前GD2库支持库支持JPEG、PNG和和WBMP格
2、式。格式。2022年12月5日星期一http:/ 是一种压缩标准的名字,通常是用来存储照片或者是一种压缩标准的名字,通常是用来存储照片或者存储具有丰富色彩和色彩层次的图像。这种格式使用了有存储具有丰富色彩和色彩层次的图像。这种格式使用了有损压缩。损压缩。PNG 是可移植的网络图像,对图像采用了无损压缩标准。是可移植的网络图像,对图像采用了无损压缩标准。WBMP是专门为无线通讯设备设计的文件格式。但是并没是专门为无线通讯设备设计的文件格式。但是并没有得到广泛应用。有得到广泛应用。2022年12月5日星期一http:/ Linux环境:环境:extension=gd2.so使用使用phpinfo(
3、)函数查看是否已经支持函数查看是否已经支持GD22022年12月5日星期一http:/ 坐标体系-介绍下图说明了php坐标系。坐标原点位于左上角,以像素为单位。像素是计算机屏幕上最小的显示单位。在php的坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。PHP中的图像处理中的图像处理2022年12月5日星期一http:/ 绘图函数介绍绘图函数介绍画直线画直线 画矩形边框画矩形边框画椭圆边框画椭圆边框填充矩形填充矩形填充椭圆填充椭圆画图片画图片(拷贝图片的一部分拷贝图片的一部分)画字符串画字符串画出弧形线画出弧形
4、线画出扇形画出扇形-可以做出可以做出3d效果的饼状图效果的饼状图2022年12月5日星期一http:/ imagecreate(int x_size,int y_size)说明:本函数用来建立一张全空的图形,返回一个图说明:本函数用来建立一张全空的图形,返回一个图像标识符,参数代表了一幅大小为像标识符,参数代表了一幅大小为 x_size x_size 和和 y_size y_size 的空白图像。单位为像素的空白图像。单位为像素 (pixel)(pixel)。2022年12月5日星期一http:/ imagedestroy(resource image)说明:本函数释放与说明:本函数释放与 i
5、mage 关联的内存。关联的内存。image 是由图像创建函数返回的图像标识符。是由图像创建函数返回的图像标识符。2022年12月5日星期一http:/ imagegif/png/jpeg(resource image,string filename):以:以GIF/PNG格式将图像输出到浏览器或文件格式将图像输出到浏览器或文件。默认将图片输出到浏览器;若有参数。默认将图片输出到浏览器;若有参数filename,则输出,则输出到该文件。该函数生成的图像格式为到该文件。该函数生成的图像格式为GIF87a。若使用。若使用imagecolortransparent函数生成透明图像,则格式为函数生成透
6、明图像,则格式为GIF89a。2022年12月5日星期一http:/ imagecreatetruecolor(int x_size,int y_size)v注:需要注:需要 GD 2.0.1 或更高版本,不能用于或更高版本,不能用于 GIF 文件格式。文件格式。2022年12月5日星期一http:/ imagecolorallocate(resource image,int red,int green,int blue)说明:本函数用来匹配图形的颜色,供其它绘图函数使用。说明:本函数用来匹配图形的颜色,供其它绘图函数使用。参数参数 image 表示图形的资源。参数表示图形的资源。参数 red
7、、green、blue 是色是色彩三原色,其值从彩三原色,其值从 0 至至 255。2022年12月5日星期一http:/ 语法:语法:bool imagefill(resource image,int x,int y,int color)说明:说明:本函数在本函数在 image 图像的坐标图像的坐标 x,y(图(图像左上角为像左上角为 0,0)处用)处用 color 颜色执行区域填充颜色执行区域填充(即与即与 x,y 点颜色相同且相邻的点都会被填充点颜色相同且相邻的点都会被填充)。)。2022年12月5日星期一http:/ 2022年12月5日星期一http:/ 要绘制复杂图像,首先要学会用
8、一些简要绘制复杂图像,首先要学会用一些简单元素的绘制,主要包括单元素的绘制,主要包括点点元素、元素、线框线框元元素、素、填充填充元素、元素、颜色颜色元素、元素、字型字型及其显示及其显示相关元素的有关操作。相关元素的有关操作。PHP中的图像处理中的图像处理2022年12月5日星期一http:/ 点元素的绘制是图像函数库中最简单的。与点有关的函数只有一个,如下所示:bool imagesetpixel(resource image,int x,int y,int color):画一个单一像素。该函数在image图像中用color颜色在x,y坐标上画一个点。参数image为图像标识,x和y分别为横、
9、纵坐标值,color为颜色。在计算机中,一般坐标原点(0,0)位于屏幕左上角,所以图像显示是上下反过来的正弦曲线,而不是在数学中所说的正弦曲线。2022年12月5日星期一http:/ /发送标头信息 header(Content-type:image/gif);$img=imagecreate(300,150);$bgcolor=imagecolorallocate($img,255,255,0);imagefill($img,0,0,$bgcolor);$red=imagecolorallocate($img,255,0,0);/通过循环生成正弦曲线 for($i=0;$i2022年12月5
10、日星期一http:/ imagearc(resource im,int cx,int cy,int w,int h,int s,int e,int col):本函数用来画弧线。原点坐标(0,0)为图片的左上角,参数 cx、cy 为椭圆心坐标,参数 w 为水平轴长,参数 h 为垂直轴长,参数 s 及 e 分别为起始角与结束角,参数 col 为弧线的颜色。参数 im 表示图形的标识符。0位于三点钟位置,以顺时针方向绘画。2022年12月5日星期一http:/ imagedashedline(resource im,int x1,int y1,int x2,int y2,int color):绘制虚
11、线。该函数从坐标(x1,y1)和(x2,y2)画一条虚线。参数color为颜色。一般使用imagesetstyle()和 imageline()的组合替代imagedashedline()函数。bool imageline(resource im,int x1,int y1,int x2,int y2,int color):绘制直线。该函数用color颜色从坐标(x1,y1)和(x2,y2)画一条直线。bool imageellipse(resource im,int cx,int cy,int w,int h,int color):在图像im上,以(cx,cy)为圆心绘制颜色为color的椭
12、圆。椭圆的宽度和高度分别为w和h。绘制线框元素绘制线框元素2022年12月5日星期一http:/ 2022年12月5日星期一http:/ imagepolygon(resource result,array points,int num_points,int color):绘制一个多边形。points是一个PHP数组,包含了多边形的各个顶点坐标,其中points0、points1分别为多边形第1个顶点的x、y坐标。points2、points3分别为多边形第2个顶点的x、y坐标,依此类推。num_points为多边形的顶点数。bool imagerectangle(resource image
13、,int x1,int y1,int x2,int y2,int color):画一个矩形。该函数用color颜色在image图像中画一个矩形,其左上角坐标为(x1,y1),右下角坐标为(x2,y2)。绘制多边形矩形元素绘制多边形矩形元素2022年12月5日星期一http:/ imagefilledpolygon(resource im,array points,int num_points,int color):画一个多边形并填充。参数points是一个PHP数组,包含了多边形的各个顶点坐标,其中points0、points1分别为多边形第1个顶点的x、y坐标。points2、points3
14、分别为多边形第2个顶点的x、y坐标,依此类推。num_points为多边形的顶点数。bool imagefilledrectangle(resource im,int x1,int y1,int x2,int y2,int color):画一个矩形并填充。该函数负责填充从(x1,y1)到(x2,y2)的矩形区域。bool imagefilledellipse(resource im,int cx,int cy,int w,int h,int color):画一个椭圆并填充。2022年12月5日星期一http:/ imagestring(resource im,int font,int x,in
15、t y,string s,int col):本函数在图片上写出:本函数在图片上写出水平水平文字。参数文字。参数 font 为字形,设为为字形,设为 1 到到 5 表示使用默认字形。参数表示使用默认字形。参数 x、y为字符串起点坐标。参数为字符串起点坐标。参数 s 表示要写入的字符串。参数表示要写入的字符串。参数 col 表示字符串的颜色。成功返回表示字符串的颜色。成功返回True,否则返回,否则返回False。使用使用GD库函数在图片上写字库函数在图片上写字2022年12月5日星期一http:/ imagefilltoborder(resource image,int x,int y,int
16、border,int color);指定颜色区域内填充。该函数从(x,y)点开始执行区域填充,直到遇到颜色为border的边界为止。值得注意的是,边界内的所有区域都会被填充。如果指定的边界色和该点颜色相同,则没有填充。如果图像中没有该边界色,则整幅图像都会被填充。2022年12月5日星期一http:/ imagecolortansparent(resource image,int color):将某个颜色定义为透明色。该函数将image图像中的透明色设定为color。参数image是imagecreate函数返回的图像标识符。参数color是imagecolorallocate函数返回的颜色标
17、识符。注意:透明色是图像的一种属性,透明度不是颜色的属性。一旦设定了某个颜色为透明色,图像中之前绘制为该色的任何区域都成为透明的。2022年12月5日星期一http:/ imagecolorat(resource image,int x,int y):获取图像中指定点的颜色索引值。该函数返回参数image所指定的图形中指定位置的像素的颜色索引值,索引值从0开始。如果 PHP 编译时加上了 GD 库 2.0 或更高的版本并且图像是真彩色图像,则本函数以整数返回该点的 RGB 值。?php$im=ImageCreateFromPng(top2.png);$rgb=Imagecolorat($im,
18、100,100);echo$rgb.;$r=($rgb 16)&0 xFF;echo$r.;$g=($rgb 8)&0 xFF;echo$g.;$b=$rgb&0 xFF;echo$b.;?绘制颜色元素绘制颜色元素2022年12月5日星期一http:/ imagecolorclosest(resource result):计算颜色索引表中与颜色(red,green,blue)最接近者。该函数返回图像调色板中与指定的RGB值最接近的颜色。指定的颜色与调色板中的每个颜色的距离计算方法是将RGB值当成三维空间中点的坐标。int imagecolorexact(resource image,int r
19、ed,int green,int blue):获取指定颜色的索引值。该函数返回图像调色板中指定颜色的索引值。如果调色板中没有指定的颜色则返回-1。2022年12月5日星期一http:/ imagecolorresolve(resource image,int red,int green,int blue):获取指定颜色的索引值或有可能得到的最接近的替代值。该函数可以保证对所求的颜色返回一个颜色索引值,可以是确切值,也可以是所能得到的最接近的替代值。void imagecolorset(resource image,int index,int red,int green,int blue):给指
20、定调色板索引设定颜色。该函数将调色板中指定的索引设定为指定的颜色。对于在调色板图像中创建类似区域填充的效果很有用,避免了真填充的开销。2022年12月5日星期一http:/ imagecolorsforindex(resource image,int index):获取颜色索引表中指定索引的颜色。该函数返回一个具有red、green、blue和alpha键名的关联数组,包含了指定颜色索引的相应值。返回的数组有3个元素,array“red”为红色强度,0255;array“green”为绿色强度,0255;array“blue”为蓝色强度,0255。2022年12月5日星期一http:/ ima
21、gecolorstotal(resource image):获取一副图像的调色板中颜色的数目。:获取一副图像的调色板中颜色的数目。该函数返回指定图像的调色板中的颜色数该函数返回指定图像的调色板中的颜色数目。目。2022年12月5日星期一http:/ header(Content-type:image/gif);$img=imagecreate(560,250);$bgcolor=imagecolorallocate($img,255,255,255);imagefill($img,0,0,$bgcolor);for($i=0;$i5;$i+)$imgcolor=imagecoloralloca
22、te($img,100+rand(0,120),100+rand(0,120),100+rand(0,120);imagefilledrectangle($img,30,50+$i*30,150,80+$i*30,$imgcolor);$black=imagecolorallocate($img,0,0,0);for($i=0;$i2022年12月5日星期一http:/ imagechar(resource im,int font,int x,int y,string c,int col):水平绘制一个字符。该函数将字符串c的第一个字符绘制在image指定的图像中。参数 font 为字形,设为
23、 1 到 5 表示使用默认字形(数字越大字体越大),也可以加载自定义字库,font的值为imageloadfont函数的返回值。参数 x、y为字符串起点坐标。参数 col 表示字符串的颜色。成功返回1,否则返回0。2022年12月5日星期一http:/ imagecharup(resource im,int font,int x,int y,string c,int col):垂直绘制一个字符。该函数将字符串c的第一个字符绘制在image指定的图像中。参数 font 为字形,设为 1 到 5 表示使用默认字形,也可以加载自定义字库,font的值为imageloadfont函数的返回值。参数 x
24、、y为字符串起点坐标。参数 col 表示字符串的颜色。成功返回1,否则返回0。int imageloadfont(string file):载入新的点阵字库。该函数加载一个用户定义的位图字体并返回该字体的标识符。如果系统提供的字型不能满足要求,可以载入自定义字库。2022年12月5日星期一http:/ 2022年12月5日星期一http:/ imagefontheight/width(int font):获取字型的高度/宽度。int imagestringup(resource im,int font,int x,int y,string s,int col):垂直的绘制一个字符串。该函数用c
25、olor颜色将字符串s绘制到image所代表的图像的(x,y)坐标处。成功返回1,否则返回0。array imagettfbbox(int size,int angle,string fontfile,string text):获取使用TrueType字体的文本范围。该函数计算并返回一个包围着TrueType 文本范围的虚拟方框的像素大小。参数size为字型的大小;angle为字型的角度;fontfile为字型文件名;text是要进行计算区域大小的文字内容。返回值为数组,包括了8个元素,按逆时针顺序,前2个为左下角的x、y坐标,依次为右下角、右上角、左上角x、y坐标。注意:这些点是相对于文本的
26、而和角度无关,因此“左上角”指的是以水平方向看文字时其左上角。2022年12月5日星期一http:/ imagettftext(int size,int angle,int x,int y,int color,string fontfile,string text):用TrueType字体向图像写入文本。该函数将字符串text绘制到image所代表的图像上,从坐标(x,y)开始,角度为angle,颜色为color,使用fontfile所指定的TrueType 字体文件。参数size为字型的大小;angle为字型的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上
27、读的文本;fontfile为字型文件名;text是要进行计算区域大小的文字内容。返回值为数组,包括了8个元素,按逆时针顺序,前2个为左下角的x、y坐标,依次为右下角、右上角、左上角x、y坐标。注意:这些点是相对于文本的而和角度无关,因此“左上角”指的是以水平方向看文字时其左上角。2022年12月5日星期一http:/ imagepsloadfont(string filename):载入PostScript Type1字库,使用方法类似于imageloadfont函数。若成功,则返回一个合法的字体索引以备使用。否则返回false并显示一条信息说明出错的地方。imagepsloadfontima
28、gepstextimagepsfreefont2022年12月5日星期一http:/ imagepsfreefont(int fontindex):释放一个PostScript Type1 字体所占用的内存。该函数的参数为imagepsloadfont函数的返回值。bool imagepsencodefont(int fontindex,string encodingfile):改变字体中字符编码矢量。该函数从文件中加载字符编码矢量并用其替换指定字体的编码矢量。array imagepstext(resource image,string text,int font,int size,int
29、foreground,int background,int x,int y,int space,int tightness,float angle,int antialias_steps):用PostScript Type1字体将文本字符串绘制在图像上。该函数中foreground是文本的颜色,background是文本以防混色方式尝试淡入的颜色。以(x,y)坐标定义第1个字符的起点,space可以用来改变字体中默认的间距值。tightness可以控制字符之间的间距。angle表示角度,size表示像素,antialias_steps可以控制防混色文本使用的颜色数目。2022年12月5日星期一
30、http:/ imagepsbbox(string text,int font,int size,int space,int tightness,float angle):获取使用PostScript Type1字体得文本范围。参数size表示像素,space可以用来改变字体中默认的间距值。tightness可以控制字符之间的间距。angle表示角度。2022年12月5日星期一http:/ 实例简单验证码的制作实例简单验证码的制作要求要求:1:随机产生:随机产生4个字符个字符.2:0-9 ,A-Z,a-z 3:将四位字符作为图像显示在浏览器上:将四位字符作为图像显示在浏览器上.例子例子:产生随
31、机数文件:产生随机数文件:rand.php显示图片:显示图片:checknumber.php2022年12月5日星期一http:/ die(Cannot Initialize new GD image stream);$background_color=imagecolorallocate($im,255,255,255);$text_color=imagecolorallocate($im,233,14,91);$line_color=imagecolorallocate($im,0,0,64);imagefilledrectangle($im,30,40,100,60,$line_colo
32、r);for($i=0;$i2022年12月5日星期一http:/ getimagesize(string filename,array imageinfo):获取图片的大小。函数返回一个具有:获取图片的大小。函数返回一个具有4个个单元的数组。索引单元的数组。索引 0 是图像宽度的像素值,索引是图像宽度的像素值,索引 1 是图是图像高度的像素值,索引像高度的像素值,索引 2 是图像类型的标记(如表是图像类型的标记(如表10.1所示)。这些标记与所示)。这些标记与 PHP 4.3 新加的新加的 IMAGETYPE 常常量对应。索引量对应。索引 3 是文本字符串,内容为是文本字符串,内容为“hei
33、ght=yyy width=xxx”,可直接用于,可直接用于 IMG 标记。如果不能访问标记。如果不能访问 filename 指定的图像或者其不是有效的图像,指定的图像或者其不是有效的图像,getimagesize()将返回将返回 FALSE 并产生一条并产生一条 E_WARNING 级的错误。该函数不需要安装级的错误。该函数不需要安装GD库就可库就可以使用。以使用。2022年12月5日星期一http:/ 该图像的长为:该图像的长为:;echo$temp0;echo;echo 该图像的宽为:该图像的宽为:;echo$temp1;echo;echo 该图像的格式为:该图像的格式为:;switch
34、($temp2)case 1:echo GIF图像图像;break;case 2:echo JPG/JPGE图像图像;break;case 3:echo PNG图像图像;break;default:echo 未知图像格式未知图像格式;break;?2022年12月5日星期一http:/ imagesx(resource image):获取图片的宽度。:获取图片的宽度。lint imagesy(resource image):获取图片的高度。:获取图片的高度。lint imagecolorallocate(resource im,int red,int green,int blue):本函数用来匹配图形的颜色,供其它:本函数用来匹配图形的颜色,供其它绘图函数使用。参数绘图函数使用。参数 im 表示图形的标识符。参数表示图形的标识符。参数 red、green、blue 是色彩三原色,其值从是色彩三原色,其值从 0 至至 255。返回一。返回一个个RGB颜色识别号。颜色识别号。2022年12月5日星期一http:/ 验证码验证码为什么需要验证码为什么需要验证码?防止恶意灌水防止恶意灌水(灌水机器人灌水机器人)防止暴力破解防止暴力破解(密码字典猜测用户名和密码密码字典猜测用户名和密码)