【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)

1.绘图技术(GD库)

注意:使用该库,php.ini文件中的extension=php_gd2.dll必须是开启状态,不然无法使用

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

区别:

  • gif 图片压缩率高,但是只能显示256色,可能造成颜色的丢失,可以显示动画
  • jpg/jpeg 图片压缩率高(有损压缩),可以用较小的文件来显示,网页上用得比较多
  • png 该格式综合了gif和jpg的优势,缺点是不能显示动画
<?php
//  创建画布
// $im=imagecreatetruecolor(800, 800);
$im=imagecreatefromjpeg("a.jpg");
// 创建颜色
$red=imagecolorallocate($im, 255, 0, 0);
// 画圆
imageellipse($im,250,100, 100, 100, $red);
// 画直线
imageline($im, 100, 100, 200, 200, $red);
// 画矩形
imagerectangle($im, 50, 50, 100, 100, $red);
// 填充矩形
imagefilledrectangle($im, 0, 150, 100, 100, $red);
// 弧线
imagearc($im, 200, 300, 30, 30, 180, 270, $red);
// 扇形
imagefilledarc($im, 300, 20, 30, 40, 20, 80, $red, IMG_ARC_EDGED);
// 拷贝图片到画布上.暂时未生效
$srcimageinfo=getimagesize($im1);
imagecopy($im, $im1, 0, 0, 0, 0, $srcimageinfo[0], $srcimageinfo[1]);
// 写字
$str="hello";
// imagestring($im, 5, 0, 0, "qqqq", $red);
imagettftext($im, 5, 0, 400, 250, $red, "simhei.ttf", $str);
// 将图片显示在网站上
header("content-type:image/png");
imagepng($im);
// 销毁资源,释放内存
imagedestroy($im);
?>

2.扇形图例题

<?php
// 1.创建画布并填充画布的背景颜色
$im=imagecreatetruecolor(400, 300);
$white=imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $white);
// 2.创建颜色
$red=imagecolorallocate($im, 255, 0, 0);
$darkred=imagecolorallocate($im, 144, 0, 0);
$blue=imagecolorallocate($im, 0, 0, 128);
$darkblue=imagecolorallocate($im, 0, 0, 80);
$gary=imagecolorallocate($im, 192, 192, 192);
$darkgary=imagecolorallocate($im, 144, 144, 144);
// 3.填充颜色到扇形区域
// 注意:宽度一定要是高度的一半,不然圆形会有空缺
// 想要改变扇形图的高度,改变i值就可以了
// 此处打印思路:
// 1.先打印阴影扇形图部分,在打印非阴影部分。避免覆盖
for ($i=60; $i > 50; $i--) {
imagefilledarc($im, 50, $i,100, 50, 0, 40, $darkblue, IMG_ARC_PIE);
imagefilledarc($im, 50, $i,100, 50, 40, 75, $darkgary, IMG_ARC_PIE);
imagefilledarc($im, 50, $i,100, 50, 75, 360, $darkred, IMG_ARC_PIE);
}
imagefilledarc($im, 50, 50,100, 50, 0, 40, $blue, IMG_ARC_PIE);
imagefilledarc($im, 50, 50,100, 50, 40, 75, $gary, IMG_ARC_PIE);
imagefilledarc($im, 50, 50,100, 50, 75, 360, $red, IMG_ARC_PIE); // 4.输出图像
header("content-type:image/png");
imagepng($im);
// 5.销毁资源
imagedestroy($im);
?>

2.使用jpgraph绘图函数库

地址:http://jpgraph.net/

1.下载jpgraph库.放在对应的服务器位置

2.将src下除Examples文件夹以外的文件移到Examples目录下(新建一个jpgraph文件夹.注意:文件夹名称必须是jpgraph.英文Examples文件夹下的例子都是引用的jpgraph文件夹下的php文件)

ps:使用jpgraph库时需要把上述的jpgraph文件夹复制到对应位置

例题:奥巴马和布什的投票系统

sql语句:

#elector表
CREATE TABLE elector(
electorid INT,
name VARCHAR(64),
votenums int,
vatemonth INT
);
#插入数据
INSERT INTO elector VALUES(2,"aobama",1,1);

index.php(主页面)

 <!DOCTYPE html>
<html>
<head>
<script type="text/javascript" language="javascript">
function look(){
window.location.href="report.php";
}
</script>
</head>
<body>
<h1>投票</h1>
<form action="addvote.php" method="post">
<input type="radio" name="vote" value="2"/>奥巴马&nbsp;&nbsp;
<input type="radio" name="vote" value="1" />布什&nbsp;&nbsp;&nbsp;
<input type="submit" value="投票"><br/><br/>
<input type="button" onclick="look();" name="ck" value="查看统计数据" />
</form>
</body>
</html>

report.php(报表页面)

 <!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<!-- 因为accbarframeex01.php文件返回的是一个图片,所以可以直接使用。
使用id来区分人
-->
<img src="accbarframeex01.php?id=1"/>
<img src="accbarframeex01.php?id=2"/>
</body>
</html>

accbarframeex01.php(jpgraph函数的一个绘图)

 <?php //content="text/plain; charset=utf-8"
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_bar.php'); //获取对应id下的投票数
$id=$_REQUEST["id"];
$sql="select * from elector where electorid =".$id." ORDER BY vatemonth;";
$conn=mysqli_connect("127.0.0.1","root","","test") or die(mysqli_error());
$res=mysqli_query($conn,$sql);
$i=0;
$str="";
$datay1=array();
$datay2=array();
//循环方法1**************************************
//注意定义变量i主要是为了取name,只取一次。
while ($row=mysqli_fetch_assoc($res)) {
$datay1[$i]=$row["votenums"];
$datay2[$i]=0;
if ($i==0) {
$str=$row['name'];
}
$i++;
}
//循环方法2**************************************
// while ($row=mysqli_fetch_assoc($res)) {
// $datay1[]=$row["votenums"];
// $datay2[]=0;
// $str=$row['name'];
// } //思路:替换$datay1和$datay2的数据及标题就ok了。
//1.数据已替换。标题也已替换$str
//原数据
// $datay1=array(13,8,19,7,17,6);
// $datay2=array(4,5,2,7,5,25); // Create the graph.
$graph = new Graph(350,250);
$graph->SetScale('textlin');
$graph->SetMarginColor('silver'); //这是写死的数据
// $str="";
// $id=$_REQUEST["id"];
// if ($id=='1') {
// $str="布什投票结果";
// }elseif ($id==2) {
// $str="奥巴马投票结果";
// } // Setup title
$graph->title->Set(iconv("UTF-8","GB2312//IGNORE","$str"));
$graph->title->SetFont(FF_SIMSUN,FS_BOLD,14); // Create the first bar
$bplot = new BarPlot($datay1);
$bplot->SetFillGradient('AntiqueWhite2','AntiqueWhite4:0.8',GRAD_VERT);
$bplot->SetColor('darkred'); // Create the second bar
$bplot2 = new BarPlot($datay2);
$bplot2->SetFillGradient('olivedrab1','olivedrab4',GRAD_VERT);
$bplot2->SetColor('darkgreen'); // And join them in an accumulated bar
$accbplot = new AccBarPlot(array($bplot,$bplot2));
$graph->Add($accbplot); $graph->Stroke();
?>

addvote.php(增加投票)

 <?php
// 思路:
// 1.先获取id。根据id更新投票数votenums的数据
// 2.如果影响的行数大于0,则表示添加成功
// 如果小于0,则说明没有这个月份。
// 2.1 获取当前的月份
// 2.2 根据id去获取id对应的name
// 2.3 往数据库插入数据。id、name、当前月份、投票数为1
$id=$_REQUEST['vote'];
$tmp_date= str_replace ("0", "",date("m"));
// echo $tmp_date;
$sql="UPDATE elector SET votenums=votenums+1 WHERE (`electorid`=$id) AND (`vatemonth`=$tmp_date) ;";
// echo "$sql";
$conn=mysqli_connect("127.0.0.1","root","","test") or die(mysqli_error());
$res=mysqli_query($conn,$sql); if (!$res) {
echo "数据库执行失败";
}else{
if (mysqli_affected_rows($conn)>0) {
echo "添加成功";
}else{
$getname="SELECT name from elector where electorid=$id LIMIT 1;";
$res1=mysqli_query($conn,$getname);
if ($row=mysqli_fetch_row($res1)) {
// var_dump($row);
$name=$row["0"];
}
$sql1="INSERT INTO elector VALUES($id,'$name',$tmp_date,1);";
$res2=mysqli_query($conn,$sql1);
echo "这是新月份,添加数据成功";
}
}
?>

界面展示:

【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)

【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)

3:短信验证码例题

login.php

 <!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<h1>短信验证码对比验证</h1>
<form action="result.php" method="post">
<tr>
<td>我是验证码:</td>
<!-- 必须带上aa。产生了随机数才会重新去获取新的验证码 -->
<td><img src="massage.php" onclick="this.src='massage.php?aa='+Math.random()"></td>
</tr>
<tr><br/><br/>
<td>请输入验证码:</td>
<td><input type="text" name="yzm" ></td>
</tr><br/><br/>
<input type="submit" value="对比">
</form>
</body>
</html>

massage.php

 <?php
//获取验证码
// 思路:1.先产生随机数
// 2.给随机数产生随机背景
// 3.给随机数绘制干扰直线 //产生随机数
$str="";
for ($i=0; $i <4 ; $i++) {
$str.=dechex(rand(0,15));
}
// 保存验证码到session中
session_start();
$_SESSION["yanzhengma"]=$str;
//创建画布
$im=imagecreatetruecolor(90, 40);
$white=imagecolorallocate($im, 255, 255, 255);
$red=imagecolorallocate($im, 255, 0, 0);
// 给画布产生随机颜色
imagefill($im, 0, 0, imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255)));
// 画干扰直线
for ($j=0; $j <20 ; $j++) {
imageline($im, rand(0,90), rand(0,40), rand(0,90), rand(0,40), imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255)));
}
// 将产生的随机数写在画布上的随机位置
imagestring($im, 5, rand(0,70), rand(0,30), "$str", $white);
// 输入图像
header("content-type:image/png");
imagepng($im);
// 销毁图像
imagedestroy($im);
?>

result.php

 <?php
// 1.获取session中存在的验证码
// 2.接受用户填写的验证码
// 3.对比判断
session_start();
// echo $_SESSION["yanzhengma"];
$yzm=$_REQUEST["yzm"];
// echo "$yzm";
if ($_SESSION["yanzhengma"]===$yzm) {
echo "验证码输入正确";
}else{
echo "验证码输入错误";
}
?>

界面显示:

【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)

【二十七】php之绘图技术(gd、jpgraph、短信随机验证码)

上一篇:WCF ABC


下一篇:【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】