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 "这是新月份,添加数据成功";
}
}
?>

界面展示:

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、短信随机验证码)的更多相关文章

  1. CDMA电信短信猫支持189等电信号码可二次开发

    CDMA电信短信猫支持189等电信号码可二次开发 这款短信猫采用法国wavecom Q2358C模块,支持短信猫二次开发,可提供短信猫二次开发包下载测试.提供相关资料文档. 此款CDMA电信短信猫有串 ...

  2. iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能

    有一个开锁的功能,具体的需求就类似于微信的"摇一摇"功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最 ...

  3. iOS几个功能:1.摇一摇;2.震动;3.简单的摇动动画;4.生成二维码图片;5.发送短信;6.播放网络音频等

    有一个开锁的功能,具体的需求就类似于微信的“摇一摇”功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最简单的功能了. 在v ...

  4. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序) 基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetad ...

  5. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序) 通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配 ...

  6. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] 对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考< ...

  7. Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】

    <Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  8. 转:二十七、Java图形化界面设计——容器(JFrame)

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

  9. PHP自学之路---报表及绘图技术

    Ø  报表 a)        什么是报表 报表就是用表格.图表等格式来动态显示数据. b)        PHP绘图坐标系 1.  坐标系介绍 下图说明了PHP坐标系.坐标原点位于左上角,以像素为单 ...

随机推荐

  1. 【SSM之旅】Spring+SpringMVC+MyBatis+Bootstrap整合基础篇(一)项目简介及技术选型相关介绍

    试水 一直想去搭建个自己的个人博客,苦于自己的技术有限,然后也个人也比较懒散.想动而不能动,想动而懒得动,就这么一直拖到了现在.总觉得应该把这几年来的所学总结一番,这样才能有所成长. 不知在何时,那就 ...

  2. Mybatis(一)实现单表的增删改查

    1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  3. SpringCloud学习笔记(2)——Ribbon

    参考SpringCloud官网第16.17章 16. Client Side Load Balancer: Ribbon Ribbon是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访 ...

  4. UWP 调用outlook邮箱反馈

    public static async Task FeedbackAsync(string address, string subject, string body) { if (address == ...

  5. Vue.js学习 — 微信公众号菜单编辑器(一)

    学习里一段时间Vue.js,于是想尝试着做一个像微信平台里那样的菜单编辑器,在这里分享下 具体样式代码查看项目github 创建一个vue实例 <!DOCTYPE html> <ht ...

  6. jvm内存回收诡异现象

    在知乎上看到一篇提问,于是做了个实验帮助他解答,这里整理成一篇文章分享一下. 先看代码如下代码: /** * Created on 2017/12/16. * * -verbose:gc -XX:+U ...

  7. 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)

    容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...

  8. Python3 词汇助手 有道翻译助手 有道导出文件格式转换

    根据有道翻译软件的功能,结合实际用途,基于Python3.6写了一个有道翻译助手软件. 测试文件及源代码已上传至:https://github.com/MMMMMichael/Translation- ...

  9. ubuntu14.04 升级mysql到5.7版本

    Ubuntu14.04默认安装的是mysql5.5,由于开发需要支持utf8mb4,因此需要升级到mysql5.7 默认情况下,apt是无法直接升级到mysql5.7的,因此需要额外设置 首先,备份数 ...

  10. 修改Mac系统的文件权限

    修改Mac系统的文件权限 有时候,因为各种各样的需求Mac OS系统使用者需要修改某个系统文件,但是很多时候Mac OS系统会提示你"没有足够的权限".所以往往会无法保侟.编辑甚至 ...