加入收藏 | 设为首页 | 会员中心 | 我要投稿 莆田站长网 (https://www.0594zz.com.cn/)- 业务安全、应用安全、终端安全、数据分析、数据应用!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php中的绘图技术详解

发布时间:2022-07-18 09:19:58 所属栏目:PHP教程 来源:互联网
导读:在php中,使用php绘图,在访问php文件时可以出现我们绘制的图像。php绘图技术可以应用于报表的开发、验证码的设计。 在介绍php绘图技术之前,我们首先需要了解一下php中的绘图坐标系:php坐标系中,坐标原点位于左上角,以像素为单位。坐标(x,y)第一个是x
  在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.创建画布,默认的背景是黑色
   
  $im=imagecreatetruecolor(400,300);
   
  //默认是黑色背景,修改为白色
   
  $white=imagecolorallocate($im,255,255,255);
   
  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格式。同样还可使用该函数,得到源图片的宽、高。
 
  //这里我们可以使用一个getimagesize()
   
  $srcImageInfo=getimagesize("arrow.jpg");
   
  $imageWidth=$srcImageInfo[0];
   
  $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)写字
 
  $str="hello,world!你好,世界!";
   
  //使用imagestring写中文会出现乱码
   
  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响应,另存!
 
  同时还要销毁该图片(释放内存——服务器的内存)。
 
  //3.输出图像到网页,也可以另存
   
  header("content-type:image/png");
   
  imagepng($im);  
   
  //4.销毁该图片(释放内存--服务器内存)
   
  imagedestory($im);
  特别注意:绘制完毕后要释放内存这一操作。
 
  完整php程序代码:
 
  <?php
   
      //php绘图技术,参考文档
   
   
   
      //1.创建画布,默认的背景是黑色
   
      $im=imagecreatetruecolor(400,300);
   
      //默认是黑色背景,修改为白色
   
      $white=imagecolorallocate($im,255,255,255);
   
      imagefill($im,0,0,$white);
   
   
   
      //2.绘制需要的各种图形(圆,直线,矩形,弧线,扇形...)
   
      //创建一个颜色
   
      $red=imagecolorallocate($im,255,0,0);
   
      //圆
   
      imageellipse($im,20,20,20,20,$red);
   
      //直线
   
      imageline($im,0,0,400,300,$red);
   
      //矩形
   
      imagerectangle($im,2,2,40,50,$red);
   
      //填充矩形
   
      imagefilledrectangle($im,2,2,40,50,$red);
   
      //弧线
   
      imagearc($im,100,100,50,50,0,30,$red);
   
      //扇形
   
      imagefilledarc($im,100,100,80,50,180,270,$red,IMG_ARC_PIE);
   
   
   
      //拷贝图片到画布
   
      //加载源图片
   
      $srcImage=imagecreatefrompng("arrow.jpg");
   
      //$test=getimagesize("arrow.jpg");
   
      //print_r($test);
   
        
   
      //这里我们可以使用一个getimagesize()
   
      $srcImageInfo=getimagesize("arrow.jpg");
   
      $imageWidth=$srcImageInfo[0];
   
      $imageHeight=$srcImageInfo[1];
   
   
   
      //拷贝源图片到目标画布
   
      imagecopy($im,$srcImage,0,0,100,0,$imageWidth,$imageHeight);
   
   
   
      //写字
   
      $str="hello,world!你好,世界!";
   
      //使用imagestring写中文会出现乱码
   
      imagestring($im,5,0,0,$str,$red);
   
      //在字体库中找中文字体(将字体拷贝到当前目录)
   
      //字体旋转时是逆时针旋转
   
      imagettftext($im,15,10,50,50,$red,"SIMYOU.TTF",$str);
   
   
   
      //3.输出图像到网页,也可以另存
   
      header("content-type:image/png");
   
      imagepng($im);
   
   
   
      //4.销毁该图片(释放内存--服务器内存)
   
      imagedestory($im);
   
  ?>
  这里还有一个案例(在php手册中也有)——绘制3D饼状图:
 
  <?php
   
      //分析思路(先画出扇形)
   
      //1.画布
   
      $im=imagecreatetruecolor(400,300);
   
   
   
      //默认是黑色背景,修改为白色
   
      $white=imagecolorallocate($im,255,255,255);
   
      imagefill($im,0,0,$white);
   
   
   
      //2.画出扇形
   
      //创建三个颜色
   
      $red=imagecolorallocate($im,254,0,0);
   
      $darkred=imagecolorallocate($im,144,0,0);
   
   
   
      $blue=imagecolorallocate($im,0,0,128);
   
      $darkblue=imagecolorallocate($im,0,0,80);
   
   
   
      $gray=imagecolorallocate($im,192,192,192);
   
      $darkgray=imagecolorallocate($im,144,144,144);
   
   
   
      for($i=60;$i>=50;$i--) {
   
          imagefilledarc($im,100,$i,100,50,75,360,$darkred,IMG_ARC_PIE);
   
          imagefilledarc($im,100,$i,100,50,0,35,$darkblue,IMG_ARC_PIE);
   
          imagefilledarc($im,100,$i,100,50,35,75,$darkgray,IMG_ARC_PIE);
   
      }
   
   
   
      imagefilledarc($im,100,50,100,50,75,360,$red,IMG_ARC_PIE);
   
      imagefilledarc($im,100,50,100,50,0,35,$blue,IMG_ARC_PIE);
   
      imagefilledarc($im,100,50,100,50,35,75,$gray,IMG_ARC_PIE);
   
   
   
   
   
      //输出图像到网页,也可以另存
   
      header("content-type:image/png");
   
      imagepng($im);
   
   
   
      //销毁该图片(释放内存--服务器内存)
   
      imagedestory($im);
   
   
   
   
   
      //可以将其封装成一个函数
   
  ?> 

(编辑:莆田站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读