百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> php中的画图技术详解
分享文章到:

php中的画图技术详解

发布时间:09/01 来源:未知 浏览: 关键词:
在php中,使用php画图,在拜访php文件时可以显现我们绘制的图像。php画图技术可以利用于报表的开发、验证码的设计。

在介绍php画图技术此前,我们第一需要理解一下php中的画图坐标系:php坐标系中,坐标原点位于左上角,以像素为单位。坐标(x,y)——第一个是x坐标,表示当前位置为水平标的目的,间隔坐标原点x个像素;第二个是y坐标,表示当前位置为垂直标的目的,间隔坐标点y个像素。


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

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

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


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

结果如下:



别的,我们可以使用php画图技术制作验证码,这里不多加说明,程序代码如下:

checkCode.php

<?php
    //echo rand(2,9);
    //echo "<br/>".dechex(rand(1,15))."<br/>";
    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的使用——用于登录界面(这里只供给部分代码,但是不影响懂得,可删除无关内容,直接使用)

<form action="loginProcess.php" method="post">
<table>
<tr><td>会员id</td><td><input type="text" name="id" value="<?php echo getCookieVal("id"); ?>"/></td></tr>
<tr><td>密 码</td><td><input type="password" name="password"/></td></tr>
<tr><td>验证码</td><td><input type="text" name="checkCode"/>
<img src="checkCode.php" onClick="this.src='checkCode.php?aa='+Math.random()"/></td></tr>
<tr><td colspan="2">可否留存会员id<input type="checkbox" value="yes" name="keep"></td></tr>
<tr><td><input type="submit" value="会员登录"/></td>
<td><input type="reset" value="从新填写"/></td></tr>
</table>
</form>

当点击验证码时,验证码会停止刷新。checkCode.php中还使用到session技术,在效劳器端留存随机出来的验证码的值,当会员登录时,会员提交验证码时,可以用session取出准确的验证码停止比对。

以上就是php中的画图技术详解的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板