PHP 生成验证码(+图片没有显示的解决办法)
今天有需要用到验证码,就敲了个,毕竟用途比较广,所以打算把代码留下来,以后肯定用得上的。当然,今天在做的时候也是有一些问题的,分享出来吧,记录自己所犯的错误,避免以后再掉坑里。
先给个效果图(下面的真的是图):

再上完整的代码吧:
<?php
// 开启 session
session_start(); // 丢弃输出缓冲区的内容 **
ob_clean(); // 1 创建画布
$img = imagecreatetruecolor(100, 30); // 2 画一个矩形并填充
$bgcolor = imagecolorallocate($img, mt_rand(120,255), mt_rand(120,255), mt_rand(120,255));
imagefilledrectangle($img, 0, 0, 100, 30, $bgcolor); // 3 在画布上进行操作 // 3.1 定义字符串
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; // 3.2 定义变量,存放验证码
$code = ''; // 3.2 加载自定义字体
$font_file = './comic.ttf'; // 3.3 生成文字部分
for ($i = 0; $i < 4; $i++) {
// 定义字体颜色
$fontcolor = imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); // 文字内容
$content = substr($str, mt_rand(0, strlen($str)-1), 1); // 设置显示坐标
$x = ($i * 100 / 4) + mt_rand(5, 10);
$y = mt_rand(17, 22); // 把文字填充到画布
imagefttext($img, 15, mt_rand(-5, 5), $x, $y, $fontcolor, $font_file, $content); // 将文字内容赋值给 code 变量
$code .= $content;
} // 3.4 将大写字母转换为小写
$code = strtolower($code); // 3.5 给 session 赋值
$_SESSION['code'] = $code; // 3.6 设置干扰元素
for ($i = 0; $i < 200; $i++) {
$pointcolor = imagecolorallocate($img, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
imagesetpixel($img, mt_rand(1, 99), mt_rand(1, 29), $pointcolor);
} // 3.7 设置干扰线
for ($i = 0; $i < 3; $i++) {
$linecolor = imagecolorallocate($img, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
imageline($img, mt_rand(1, 99), mt_rand(1, 29), mt_rand(1, 99), mt_rand(1, 29), $pointcolor);
} // 4 向浏览器输出图片头信息
header('Content-Type:image/png'); // 5 输出图片到浏览器
imagepng($img); // 6 销毁图片
imagedestroy($img);
?>
遇到的一个比较严重的问题,也就是我没能独立解决的,就是 ob_clean() 那里(注释上加了俩 * 呢),最初是没有这行代码的。当然,现象就是怎么都刷不出图,看了手册也没找到解决办法,最后还是依赖了度娘,找到了上面的解决办法。(万能的度娘,请收下我的膝盖)
自我感觉注释还是比较详细的吧,反正我看得懂(马马虎虎)。
当然,ob_clean() 并不能解决所有的不能显示的问题,具体问题具体分析,视自己的情况而定。
PHP 生成验证码(+图片没有显示的解决办法)的更多相关文章
- ecshop验证码图片无法显示终极解决办法
ecshop验证码图片无法显示终极解决办法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2014-06-06 客户在安装好ecshop之后所有前台的证码不显示,后 ...
- dedecms织梦系统后台验证码图片不显示的解决方法
网站迁移后,dedecms织梦系统后台验证码图片不显示的解决方法通用解决方案-取消后台验证码功能因为没有验证码,不能进后台,所以修改php文件源代码:方法一:打开dede/login.php 找到如下 ...
- IE6 验证码刷新失败显示空白解决办法
原因:点击a标签看不清?换图片 结果验证码显示的空白! 解决办法:在对应的点击事件最后加上return false 即可解决问题. 下面是HTML源码: <p class="regis ...
- 如何解决php 生成验证码图片不显示问题
最近遇到一个问题,就是验证码在别人的电脑上可以显示,但是我自己的电脑上去不能.原因找了好久,哈哈,终于找到了!现在给大家分享一下: 程序: <?php $w = 80; //设置图片宽和高 $h ...
- SpringMVC生成的验证码图片不显示
近期用SSM框架写一个项目,登录模块需要生成验证码图片,我把相关的代码写好了之后传到 jsp ,但是图片不显示,查看控制台显示404,反复查询了一下代码并没有发现任何问题,代码如下: @Control ...
- java web,生成验证码图片的技术
偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...
- 第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证
Tornado框架-生成验证码图片,以及验证码结合Session验证 第一.生成验证码图片 生成验证码图片需要两个必须模块 1.python自带的random(随机模块) 2.Pillow()图像处 ...
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- JavaWeb---总结(九)通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl. ...
随机推荐
- leetcode215
class Solution { public: int findKthLargest(vector<int>& nums, int k) { sort(nums.begin(), ...
- python中并发编程基础1
并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就 ...
- [INet] WebSocket 数据收发的详细过程
WebSocket 和 HTTP 相似,只是一个应用层协议,对下层透明,所以不涉及 TCP/IP. 由于浏览器支持了 WebSocket,所以在用 JS 写客户端的时候,是无需考虑数据的编码解码的. ...
- c++之&
转自www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html 一直以为&是取地址,也看到引用,但是今天才发现引用跟取址完全不是一个意思,&am ...
- prim及其练习
关于prim,其实我今天才学... prim其实就是最小生成树的一种算法,严格每次的找最小边连到树上.看书上的代码看不懂,于是就自己大胆用堆优化写prim. 搞了很长时间,经过不写努力,还是搞出来了. ...
- 关于吴恩达机器学习支持向量机的问题,讲到对偶前有一个最小化f(w)使用拉格朗日求解时转化成一个最大的相等式的理解和一些困惑
(纯属个人理解) 参考: https://www.zhihu.com/question/267482928 https://www.cnblogs.com/90zeng/p/Lagrange_dual ...
- NYOJ252-01串-(数位dp)
252-01串 内存限制:64MB 时间限制:1000ms 特判: No通过数:33 提交数:49 难度:2 题目描述: ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子 ...
- Java的学习05
今天学习了,Java中的LinkedList类.这个类需要用到链表的知识,以前一直以为,只有c/c++有链表.今天才知道,原来其他语言.也有链表,而且还是双向链表. /** * 自定义一个链表 * @ ...
- sh 了解
shell 脚本中 `dirname $0` 在命令行状态下单纯的执行时没有意义的,因为他返回当前路径的“.”. 在脚本中他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行的程序的相对位置 ...
- c#: 简单的日志管理类(TextWriterTraceListener)
以c#实现轻量级的日志管理,着实简单,置一静态类记之: /// <summary> /// 日志管理 /// </summary> public static class Lo ...