0

0

php中的绘图技术详解

藏色散人

藏色散人

发布时间:2020-07-11 13:55:44

|

6001人浏览过

|

来源于csdn

转载

       在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(高保真) 该格式综合了gifjpg的优势,缺点就是不能显示动画。


现在,开始介绍一下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

ShoopD 网上商店系统
ShoopD 网上商店系统

用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最

下载

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手册中也有)——绘制3D饼状图:

=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);


	//可以将其封装成一个函数
?>

结果如下:



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

checkCode.php

".dechex(rand(1,15))."
"; session_start(); $checkCode=""; for($i=0;$i<4;$i++) { $checkCode.=dechex(rand(1,15)); } //讲随机验证码保存到session中 $_SESSION['myCheckCode']=$checkCode; //创建图片,并把随机数画上去 $img=imagecreatetruecolor(110, 30); //背景默认就是黑色 //你可以指定背景颜色 $bgcolor=imagecolorallocate($img, 0, 0, 0); imagefill($img, 0, 0, $bgcolor); //创建新的颜色 $white=imagecolorallocate($img, 255, 255, 255); $blue=imagecolorallocate($img, 0, 0, 255); $red=imagecolorallocate($img, 255, 0, 0); $green=imagecolorallocate($img, 0, 255, 0); //画出干扰线段 for($i=0;$i<20;$i++) { //更好的方法是颜色随机 imageline($img, rand(0,110), rand(0,30), rand(0,110), rand(0,30), imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255))); } //画出噪点,自己画 //for($i=0;$i<10;$i++) //把四个随机值画上去 imagestring($img, rand(1,5), rand(2,80), rand(2,10), $checkCode, $white); //如果要使用中文 //array imagefttext(string $font_file, string $text [,array $extrainfo) //imagettftext($img,15,10,20,25,$white,"STXINWET.TTF","北京你好"); //输出 header("content-type: image/png"); imagepng($img); ?>

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

用户id"/>
密 码
验证码 @@##@@
是否保存用户id

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

php中的绘图技术详解

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

44

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

58

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

11

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

65

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

36

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

75

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

21

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号