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. thinkphp做搜索功能

    一般后台都需要做一些搜索功能,直接上图. 至于前端页面大家自己设计.

  2. Django的ModelForm组件

    创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...

  3. 单词接龙dfs洛谷

    题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...

  4. lunx命令2

    测试网络 ping 查看ip ifconfig 关闭防火墙 iptables -F 干掉nginx进程 killall nginx 切换用户 su linux下连接另一台linux服务区 ssh ro ...

  5. FreeRTOS--疑难解答

    此章节涉及新手最常遇见的3种问题: 错误的中断优先级设置 栈溢出 不恰当的使用printf() 使用configASSERT()能够显著地提高生产效率,它能够捕获.识别多种类型的错误.强烈建议在开发或 ...

  6. 让你的Javascript提升70%性能

    现在的JavaScript代码要进行性能优化,通常使用一些常规手段,如:延迟执行.预处理.setTimeout等异步方式避免处理主线程,高大上一点的会使用WebWorker.即使对于WebWorker ...

  7. webrc视频数据发送处理流程详解

  8. 如何在Raspberry Pi 3B中安装Windows 10 IoT Core

    Windows 10 IoT Core简介 Windows 10 IoT是微软专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT 操作系统的核心版本 ...

  9. Python - 首字母大写(capwords) 和 创建转换表(maketrans) 具体解释

    首字母大写(capwords) 和 创建转换表(maketrans) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27 ...

  10. 赵雅智_Swift(1)_swift简单介绍及类型

    Swift 是 iOS 和 OS X 应用开发的一门新语言. 假设你有 C 或者 Objective-C 开发经验, Swift 的非常多内容都是你熟悉的. Swift 的类型是在 C 和 Objec ...