【二十七】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"/>奥巴马
<input type="radio" name="vote" value="1" />布什
<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 "这是新月份,添加数据成功";
}
}
?>
界面展示:
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、短信随机验证码)的更多相关文章
- CDMA电信短信猫支持189等电信号码可二次开发
CDMA电信短信猫支持189等电信号码可二次开发 这款短信猫采用法国wavecom Q2358C模块,支持短信猫二次开发,可提供短信猫二次开发包下载测试.提供相关资料文档. 此款CDMA电信短信猫有串 ...
- iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能
有一个开锁的功能,具体的需求就类似于微信的"摇一摇"功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最 ...
- iOS几个功能:1.摇一摇;2.震动;3.简单的摇动动画;4.生成二维码图片;5.发送短信;6.播放网络音频等
有一个开锁的功能,具体的需求就类似于微信的“摇一摇”功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最简单的功能了. 在v ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序) 基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetad ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序) 通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配 ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] 对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考< ...
- Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】
<Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- 转:二十七、Java图形化界面设计——容器(JFrame)
转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...
- PHP自学之路---报表及绘图技术
Ø 报表 a) 什么是报表 报表就是用表格.图表等格式来动态显示数据. b) PHP绘图坐标系 1. 坐标系介绍 下图说明了PHP坐标系.坐标原点位于左上角,以像素为单 ...
随机推荐
- thinkphp做搜索功能
一般后台都需要做一些搜索功能,直接上图. 至于前端页面大家自己设计.
- Django的ModelForm组件
创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...
- 单词接龙dfs洛谷
题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...
- lunx命令2
测试网络 ping 查看ip ifconfig 关闭防火墙 iptables -F 干掉nginx进程 killall nginx 切换用户 su linux下连接另一台linux服务区 ssh ro ...
- FreeRTOS--疑难解答
此章节涉及新手最常遇见的3种问题: 错误的中断优先级设置 栈溢出 不恰当的使用printf() 使用configASSERT()能够显著地提高生产效率,它能够捕获.识别多种类型的错误.强烈建议在开发或 ...
- 让你的Javascript提升70%性能
现在的JavaScript代码要进行性能优化,通常使用一些常规手段,如:延迟执行.预处理.setTimeout等异步方式避免处理主线程,高大上一点的会使用WebWorker.即使对于WebWorker ...
- webrc视频数据发送处理流程详解
- 如何在Raspberry Pi 3B中安装Windows 10 IoT Core
Windows 10 IoT Core简介 Windows 10 IoT是微软专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT 操作系统的核心版本 ...
- Python - 首字母大写(capwords) 和 创建转换表(maketrans) 具体解释
首字母大写(capwords) 和 创建转换表(maketrans) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27 ...
- 赵雅智_Swift(1)_swift简单介绍及类型
Swift 是 iOS 和 OS X 应用开发的一门新语言. 假设你有 C 或者 Objective-C 开发经验, Swift 的非常多内容都是你熟悉的. Swift 的类型是在 C 和 Objec ...