当前位置:首页 > PHP教程 > php图像处理 > 列表

php中的绘图技术详解

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-06 10:51:20 浏览: 评论:0 

在php中,使用php绘图,在访问php文件时可以出现我们绘制的图像。php绘图技术可以应用于报表的开发、验证码的设计。

在介绍php绘图技术之前,我们首先需要了解一下php中的绘图坐标系:php坐标系中,坐标原点位于左上角,以像素为单位。坐标(x,y)——第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标点y个像素。

php中的绘图技术详解

特别说明:像素不是一个长度单位,而是一个密度单位。理论上,分辨率越小,一个像素所占的长度会大大一些。

php绘图的基本原理和步骤

(1)创建画布

(2)绘制需要的各种图形(圆,直线,矩形,弧线,扇形...)

(3)输出图像到网页,也可以另存(可以另存为网站开发常见的几种图片格式,基于存储格式问题,下面介绍一下常见图片格式的特点)

(4)销毁该图片(释放内存)

目前网站开发常见的图片格式有:gif jpg/jpeg png bmp...

总结:

gif 图片压缩率高,但是只能显示256色,可能造成颜色丢失,可以显示动画图片;

jpg/jpeg 图片压缩率高(有损压缩),可以用较小的文件来显示,网页上用的比较多;

png(高保真) 该格式综合了gif和jpg的优势,缺点就是不能显示动画。

现在,开始介绍一下php中自带的绘图函数。在开讲之前,首先要确认php配置文件中是否已经启用了gd库(php的绘图库)—— extension=php_gd2.dll。如果没有启用,则启用后需重启apache!!!

php绘图中,我们首先要创建画布,默认画布的背景色是黑色。

  1. //1.创建画布,默认的背景是黑色 
  2.  
  3. $im=imagecreatetruecolor(400,300); 
  4.  
  5. //默认是黑色背景,修改为白色 
  6.  
  7. $white=imagecolorallocate($im,255,255,255); 
  8.  
  9. imagefill($im,0,0,$white); 

开始在画布$im上绘制图形:

选择绘制图形使用的颜色(这里使用红色)

//创建一个颜色

$red=imagecolorallocate($im,255,0,0);

(1)画椭圆(当然用同样的函数也可以画出圆)

imageellipse($im,20,20,20,20,$red);

第1个参数表示在哪个画布在绘图;第2、3个参数表示椭圆的中心坐标(x,y);

第4、5个参数表示椭圆的宽、高(当然宽、高相同时则画出来的椭圆就是圆);

第6个参数表示使用的颜色。

(2)画直线

imageline($im,0,0,400,300,$red);

第1个参数表示在哪个画布在绘图;

第2、3个参数表示直线的起点坐标(x1,y1);

第4、5个参数表示直线的终点坐标(x2,y2);

第6个参数表示使用的颜色。

(3)画矩形

imagerectangle($im,2,2,40,50,$red);

第1个参数表示在哪个画布在绘图;

第2、3个参数表示矩形的左上角坐标(x1,y1);

第4、5个参数表示矩形的宽、高;

第6个参数表示使用的颜色。

(4)画填充矩形

imagefilledrectangle($im,2,2,40,50,$red);

(参数含义同”画矩形“)

(5)画弧线

imagearc($im,100,100,50,50,0,30,$red);

画弧线是基于类似画椭圆的参数传递参数的。

第1个参数表示在哪个画布在绘图;

第2、3个参数表示弧线所在椭圆的中心坐标(x,y);

第4、5个参数表示弧线所在椭圆的宽、高;

第6、7个参数表示从(第6个参数的值)度到(第7个参数的值)度(如,第6、7个参数值分别为0、30,此时表示从0°顺时针旋转30°画出弧线,而0°所在方向是水平向右的方向);

第8个参数表示使用的颜色。

(6)画扇形

imagefilledarc($im,100,100,80,50,180,270,$red,IMG_ARC_PIE);

(前8个参数的含义同”画弧线“)第9个参数是php中自带的常量。该值可以为:

IMG_ARC_PIE

IMG_ARC_CHORD

IMG_ARC_NOFILL

IMG_ARC_EDGED

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

(7)拷贝源图片到目标画布

首先要加载源图片(如,arrow.jpg)

//加载源图片

$srcImage=imagecreatefrompng("arrow.jpg");

这里特别注意的是:虽然我这张图片的后缀名为jpg,但实际上我调用的却是加载格式为jpg图片的函数。可能读者会纳闷,为什么不是调用imagecreatefromjpeg这个函数呢?实际上,文件的后缀名不能让我们断定该文件究竟属于哪种格式,也就是说即便现在这张图片的后缀名是.jpg,但是也有可能这个图片的真正格式是png格式。那么如何知道该图片的真正格式呢?可以使用getimagesize("arrow.jpg"); 查看该图片的格式。

$test=getimagesize("arrow.jpg");

print_r($test);

打印出返回结果$test后,你就会知道它返回结果的含义了。包括我们可以清楚地知道该图片的”真面目“,其实格式是png格式。同样还可使用该函数,得到源图片的宽、高。

  1. //这里我们可以使用一个getimagesize() 
  2.  
  3. $srcImageInfo=getimagesize("arrow.jpg"); 
  4.  
  5. $imageWidth=$srcImageInfo[0]; 
  6.  
  7. $imageHeight=$srcImageInfo[1]; 

得到宽、高后,将图片拷贝到目标画布上。

//拷贝源图片到目标画布

imagecopy($im,$srcImage,0,0,100,0,$imageWidth,$imageHeight);

第1个参数表示在哪个画布在绘图;

第2参数表示加载的源图片;

第3、4个参数表示目标画布的坐标(x1,y1)(拷贝至画布的坐标(x1,y1)位置);

第5、6个参数表示截取原图片的左上角的坐标(x2,y2)位置;

第7、8个参数表示截取原图片的宽、高值。

(8)写字

  1. $str="hello,world!你好,世界!"
  2.  
  3. //使用imagestring写中文会出现乱码 
  4.  
  5. imagestring($im,5,0,0,$str,$red); 

第1个参数表示在哪个画布在绘图;

第2个参数表示内置字体(取值是1、2、3、4或5);

第3、4个参数表示所要绘制的内容的左上角的位置坐标;

第5个参数表示所要绘制的内容;第6个参数表示使用的颜色。

使用imagestring函数绘制中文时会出现乱码,这里需要使用到另一个函数 imagettftext。

//在字体库中找中文字体(将字体拷贝到当前目录)

//字体旋转时是逆时针旋转

imagettftext($im,15,10,50,50,$red,"SIMYOU.TTF",$str);

第1个参数表示在哪个画布在绘图;

第2个参数表示字体大小;

第3个参数表示设置字体旋转的角度;

第4、5个参数表示所要绘制的内容的左上角的位置坐标;

第6个参数表示使用的颜色;

第7个参数表示字体名称,从字体库复制到当前目录下的字体名;

第8个参数表示所要绘制的内容。

最后,绘制完毕后,需要将图像输出到网页——http响应,另存!

同时还要销毁该图片(释放内存——服务器的内存)。

  1. //3.输出图像到网页,也可以另存 
  2.  
  3. header("content-type:image/png"); 
  4.  
  5. imagepng($im);  
  6.  
  7. //4.销毁该图片(释放内存--服务器内存) 
  8.  
  9. imagedestory($im); 

特别注意:绘制完毕后要释放内存这一操作。

完整php程序代码:

  1. <?php 
  2.  
  3.     //php绘图技术,参考文档 
  4.  
  5.  
  6.  
  7.     //1.创建画布,默认的背景是黑色 
  8.  
  9.     $im=imagecreatetruecolor(400,300); 
  10.  
  11.     //默认是黑色背景,修改为白色 
  12.  
  13.     $white=imagecolorallocate($im,255,255,255); 
  14.  
  15.     imagefill($im,0,0,$white); 
  16.  
  17.  
  18.  
  19.     //2.绘制需要的各种图形(圆,直线,矩形,弧线,扇形...) 
  20.  
  21.     //创建一个颜色 
  22.  
  23.     $red=imagecolorallocate($im,255,0,0); 
  24.  
  25.     //圆 
  26.  
  27.     imageellipse($im,20,20,20,20,$red); 
  28.  
  29.     //直线 
  30.  
  31.     imageline($im,0,0,400,300,$red); 
  32.  
  33.     //矩形 
  34.  
  35.     imagerectangle($im,2,2,40,50,$red); 
  36.  
  37.     //填充矩形 
  38.  
  39.     imagefilledrectangle($im,2,2,40,50,$red); 
  40.  
  41.     //弧线 
  42.  
  43.     imagearc($im,100,100,50,50,0,30,$red); 
  44.  
  45.     //扇形 
  46.  
  47.     imagefilledarc($im,100,100,80,50,180,270,$red,IMG_ARC_PIE); 
  48.  
  49.  
  50.  
  51.     //拷贝图片到画布 
  52.  
  53.     //加载源图片 
  54.  
  55.     $srcImage=imagecreatefrompng("arrow.jpg"); 
  56.  
  57.     //$test=getimagesize("arrow.jpg"); 
  58.  
  59.     //print_r($test); 
  60.  
  61.       
  62.  
  63.     //这里我们可以使用一个getimagesize() 
  64.  
  65.     $srcImageInfo=getimagesize("arrow.jpg"); 
  66.  
  67.     $imageWidth=$srcImageInfo[0]; 
  68.  
  69.     $imageHeight=$srcImageInfo[1]; 
  70.  
  71.  
  72.  
  73.     //拷贝源图片到目标画布 
  74.  
  75.     imagecopy($im,$srcImage,0,0,100,0,$imageWidth,$imageHeight); 
  76.  
  77.  
  78.  
  79.     //写字 
  80.  
  81.     $str="hello,world!你好,世界!"
  82.  
  83.     //使用imagestring写中文会出现乱码 
  84.  
  85.     imagestring($im,5,0,0,$str,$red); 
  86.  
  87.     //在字体库中找中文字体(将字体拷贝到当前目录) 
  88.  
  89.     //字体旋转时是逆时针旋转 
  90.  
  91.     imagettftext($im,15,10,50,50,$red,"SIMYOU.TTF",$str); 
  92.  
  93.  
  94.  
  95.     //3.输出图像到网页,也可以另存 
  96.  
  97.     header("content-type:image/png"); 
  98.  
  99.     imagepng($im); 
  100.  
  101.  
  102.  
  103.     //4.销毁该图片(释放内存--服务器内存) 
  104.  
  105.     imagedestory($im); 
  106.  
  107. ?> 

这里还有一个案例(在php手册中也有)——绘制3D饼状图:

  1. <?php 
  2.  
  3.     //分析思路(先画出扇形) 
  4.  
  5.     //1.画布 
  6.  
  7.     $im=imagecreatetruecolor(400,300); 
  8.  
  9.  
  10.  
  11.     //默认是黑色背景,修改为白色 
  12.  
  13.     $white=imagecolorallocate($im,255,255,255); 
  14.  
  15.     imagefill($im,0,0,$white); 
  16.  
  17.  
  18.  
  19.     //2.画出扇形 
  20.  
  21.     //创建三个颜色 
  22.  
  23.     $red=imagecolorallocate($im,254,0,0); 
  24.  
  25.     $darkred=imagecolorallocate($im,144,0,0); 
  26.  
  27.  
  28.  
  29.     $blue=imagecolorallocate($im,0,0,128); 
  30.  
  31.     $darkblue=imagecolorallocate($im,0,0,80); 
  32.  
  33.  
  34.  
  35.     $gray=imagecolorallocate($im,192,192,192); 
  36.  
  37.     $darkgray=imagecolorallocate($im,144,144,144); 
  38.  
  39.  
  40.  
  41.     for($i=60;$i>=50;$i--) { 
  42.  
  43.         imagefilledarc($im,100,$i,100,50,75,360,$darkred,IMG_ARC_PIE); 
  44.  
  45.         imagefilledarc($im,100,$i,100,50,0,35,$darkblue,IMG_ARC_PIE); 
  46.  
  47.         imagefilledarc($im,100,$i,100,50,35,75,$darkgray,IMG_ARC_PIE); 
  48.  
  49.     } 
  50.  
  51.  
  52.  
  53.     imagefilledarc($im,100,50,100,50,75,360,$red,IMG_ARC_PIE); 
  54.  
  55.     imagefilledarc($im,100,50,100,50,0,35,$blue,IMG_ARC_PIE); 
  56.  
  57.     imagefilledarc($im,100,50,100,50,35,75,$gray,IMG_ARC_PIE); 
  58.  
  59.  
  60.  
  61.  
  62.  
  63.     //输出图像到网页,也可以另存 
  64.  
  65.     header("content-type:image/png"); 
  66.  
  67.     imagepng($im); 
  68.  
  69.  
  70.  
  71.     //销毁该图片(释放内存--服务器内存) 
  72.  
  73.     imagedestory($im); 
  74.  
  75.  
  76.  
  77.  
  78.  
  79.     //可以将其封装成一个函数 
  80.  
  81. ?> 

结果如下:

php中的绘图技术详解

另外,我们可以使用php绘图技术制作验证码,这里不多加解释,程序代码如下:

checkCode.php

  1. <?php 
  2.  
  3.     //echo rand(2,9); 
  4.  
  5.     //echo "<br/>".dechex(rand(1,15))."<br/>"; 
  6.  
  7.     session_start(); 
  8.  
  9.     $checkCode=""
  10.  
  11.     for($i=0;$i<4;$i++) { 
  12.  
  13.         $checkCode.=dechex(rand(1,15)); 
  14.  
  15.     } 
  16.  
  17.       
  18.  
  19.     //讲随机验证码保存到session中 
  20.  
  21.     $_SESSION['myCheckCode']=$checkCode
  22.  
  23.     //创建图片,并把随机数画上去 
  24.  
  25.     $img=imagecreatetruecolor(110, 30); 
  26.  
  27.     //背景默认就是黑色 
  28.  
  29.     //你可以指定背景颜色 
  30.  
  31.     $bgcolor=imagecolorallocate($img, 0, 0, 0); 
  32.  
  33.     imagefill($img, 0, 0, $bgcolor); 
  34.  
  35.     //创建新的颜色 
  36.  
  37.     $white=imagecolorallocate($img, 255, 255, 255); 
  38.  
  39.     $blue=imagecolorallocate($img, 0, 0, 255); 
  40.  
  41.     $red=imagecolorallocate($img, 255, 0, 0); 
  42.  
  43.     $green=imagecolorallocate($img, 0, 255, 0); 
  44.  
  45.       
  46.  
  47.     //画出干扰线段 
  48.  
  49.     for($i=0;$i<20;$i++) { 
  50.  
  51.         //更好的方法是颜色随机 
  52.  
  53.         imageline($img, rand(0,110), rand(0,30), rand(0,110), rand(0,30),  
  54.  
  55.             imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255))); 
  56.  
  57.     } 
  58.  
  59.       
  60.  
  61.     //画出噪点,自己画 
  62.  
  63.     //for($i=0;$i<10;$i++) 
  64.  
  65.     //把四个随机值画上去 
  66.  
  67.       
  68.  
  69.     imagestring($img, rand(1,5), rand(2,80), rand(2,10), $checkCode$white); 
  70.  
  71.       
  72.  
  73.     //如果要使用中文 
  74.  
  75.     //array imagefttext(string $font_file, string $text [,array $extrainfo) 
  76.  
  77.     //imagettftext($img,15,10,20,25,$white,"STXINWET.TTF","北京你好"); 
  78.  
  79.     //输出 
  80.  
  81.     header("content-type: image/png"); 
  82.  
  83.     imagepng($img); 
  84.  
  85.       
  86.  
  87. ?> 

checkCode.php的使用——用于登录界面(这里只提供部分代码,但是不影响理解,可删除无关内容,直接使用)

  1. <form action="loginProcess.php" method="post"> 
  2.  
  3. <table> 
  4.  
  5. <tr><td>用户id</td><td><input type="text" name="id" value="<?php echo getCookieVal("id"); ?>"/></td></tr> 
  6.  
  7. <tr><td>密 码</td><td><input type="password" name="password"/></td></tr> 
  8.  
  9. <tr><td>验证码</td><td><input type="text" name="checkCode"/> 
  10.  
  11. <img src="checkCode.php" onClick="this.src='checkCode.php?aa='+Math.random()"/></td></tr> 
  12.  
  13. <tr><td colspan="2">是否保存用户id<input type="checkbox" value="yes" name="keep"></td></tr> 
  14.  
  15. <tr><td><input type="submit" value="用户登录"/></td> 
  16.  
  17. <td><input type="reset" value="重新填写"/></td></tr> 
  18.  
  19. </table> 
  20.  
  21. </form> 

当点击验证码时,验证码会进行刷新。checkCode.php中还使用到session技术,在服务器端保存随机出来的验证码的值,当用户登录时,用户提交验证码时,可以用session取出正确的验证码进行比对。

Tags: php绘图技术

分享到: