设为首页 收藏本站
查看: 649|回复: 0

[经验分享] PHP 画图应用 验证码 柱状图

[复制链接]

尚未签到

发表于 2017-4-1 09:50:28 | 显示全部楼层 |阅读模式
  Title:  PHP 画图应用 验证码 柱状图
  Author:  MoreWindows
  Blog:  http://blog.csdn.net/MoreWindows
  KeyWord: PHP 验证码 柱状图 imagefilledarc
  
  阅读本文之前,推荐先参阅姊妹篇《PHP 画图基础》。
  本篇介绍如何使用PHP常用的绘图函数来生成验证码图片和柱状图。
  一.验证码
  在网站中验证码是非常有用的,下图就是一个含4个数字的验证码图片。
DSC0000.gif

  简单的验证码图片主要通过在正确内容上增加一些干扰的点和线。这种方法实现起来方便容易,作为示范,本文实现了一个随机字体(有10种字体文件),支持随机文字颜色,有干扰点,干扰线的验证码类,此类可以批量在磁盘上生成验证码图片并指定验证码由多少个数字多少个字母组成。具体功能可以参阅代码:
<?php//PHP生成验证码// by MoreWindows( http://blog.csdn.net/MoreWindows )class CSecurity_verify{private $m_image;private $m_dir_name;private $m_image_width;private $m_image_height;private $m_digit_num;private $m_letter_num;private $m_font_color;const NOISE_DOT_NUM = 100; //干扰点个数const NOISE_LINE_NUM = 40; //干扰线个数/** $dir_name 保存验证码图片的文件夹目录(绝对路径)* $digit_num 数字个数* $letter_num 字母个数* $width 验证码图片宽* $height 验证码图片高*/ public function __construct($dir_name, $digit_num, $letter_num, $width = 140, $height = 40){$this->m_dir_name = $dir_name;$this->m_digit_num = $digit_num;$this->m_letter_num = $letter_num;$this->m_image_width = $width;$this->m_image_height = $height;}/** 在指定目录上生成指定条件的验证码图片* $verify_pic_num 要生成多少张验证码图片*/public function BatchVerifyPicture($verify_pic_num){while ($verify_pic_num >= 0){$verify_pic_num--;self::CreateVerifyImage();self::DrawNoiseDot();self::DrawNoiseLine();$verify_text = self::GetVerifyText();$filesize = self::DrawVerifyImage($verify_text);if ($filesize != -1)echo $verify_text . ".png生成成功,大小" . $filesize . "字节 <br />";elseecho $verify_text . ".png生成失败<br />";}}/** 创建图片*/protected function CreateVerifyImage(){$this->m_image = imagecreatetruecolor($this->m_image_width, $this->m_image_height) or die("CreateVerifyImage failde");$black_color = imagecolorallocate($this->m_image, 243, 251, 254);imagefill($this->m_image, 0, 0, $black_color);//设置底色//字体颜色$m_font_color = imagecolorallocate($this->m_image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));}/** 生成验证码内容* 验证码中使用的字符,01IOQ容易混淆,故不用。*/protected function GetVerifyText(){$verify_text = "";$letter_array = "ABCDEFGHJKLMNPRSTUVWXYZ";$digit_num = $this->m_digit_num;$letter_num = $this->m_letter_num;while ($digit_num--) //数字$verify_text .= mt_rand(2, 9);while ($letter_num--) //字母$verify_text .= $letter_array[mt_rand(0, 22)];return $verify_text;}/** 绘验证码*/protected function DrawVerifyImage($verify_text){//字体文件$font_file = "ttfs\\t" . mt_rand(1, 10) . ".ttf";//$verify_text_show = "";for ($i = 0; $i < strlen($verify_text); $i++)$verify_text_show .= ($verify_text[$i] . " ");//文字的大小,角度,位置$font_size = 20;$font_angle = mt_rand(0, 5);$font_pos_x = 0;$font_pos_y = $this->m_image_height - 5;imagettftext($this->m_image, $font_size, $font_angle, $font_pos_x, $font_pos_y, $this->m_font_color, $font_file, $verify_text_show);$verify_image_filename = $this->m_dir_name . "\\$verify_text.png";if (!imagepng($this->m_image, $verify_image_filename))return -1;imagedestroy($this->m_image);return filesize($verify_image_filename);}/** 绘干扰点*/protected function DrawNoiseDot(){$noise_dot_color = $this->m_font_color;for ($i = 0; $i < self::NOISE_DOT_NUM; $i++){imagesetpixel($this->m_image, mt_rand(0, $this->m_image_width), mt_rand(0, $this->m_image_height), $noise_dot_color);}}/** 绘干扰线*/protected function DrawNoiseLine(){for ($i = 0; $i < self::NOISE_LINE_NUM; $i++){$noise_line_color = imagecolorallocate($this->m_image, mt_rand(50, 120), mt_rand(50, 120), mt_rand(50, 120));imageline($this->m_image, mt_rand(0, $this->m_image_width), mt_rand(0, $this->m_image_height), mt_rand(0, $this->m_image_width), mt_rand(0, $this->m_image_height), $noise_line_color);}}}?>  再给出使用示例,运行后可以会D盘上生成6张验证码图片,代码如下:
<?phprequire_once 'CSecurity_verify.php';$test = new CSecurity_verify("D:\\", 4, 0);$test->BatchVerifyPicture(6);?>  生成的验证码效果如下所示:
DSC0001.gif


  当然还有很多特效可以加入的,如文字水波化、背景增加彩色小字母干扰等等,这些都可以有效的美化验证码图片。有需要的筒子们可以深入学习下,这里就不细究了。
  注 程序所使用字体文件可以从C:\Windows\Fonts中选择,并拷贝到PHP文件所在目录中的ttfs文件夹。
  二.柱状图
  在PHP中绘制柱状图可以使用bool imagefilledarc( resource $image , int $cx , int $cy , int $w , int $h , int $s , int $e , int $color , int $style )函数。此函数的说明可以参考《PHP 画图基础》一文,柱状图原理很简单就是先用暗色绘制多层再用亮色绘制最上层,这样明暗对比就可以产生立体效果。具体过程可以参考下图:
DSC0002.gif

  再给出一个PHP根据各数据值来生成柱状图的示例代码:
<?php//柱状图// by MoreWindows( http://blog.csdn.net/MoreWindows )$image_width = 400;$image_height = 300;$image = imagecreatetruecolor($image_width, $image_height);$black_color = imagecolorallocate($image, 243, 251, 254);imagefill($image, 0, 0, $black_color);//设置底色//亮色$gray_color     = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);$navy_color     = imagecolorallocate($image, 0x00, 0x00, 0x80);$red_color      = imagecolorallocate($image, 0xFF, 0x00, 0x00);//暗色$darkgray_color = imagecolorallocate($image, 0x90, 0x90, 0x90);$darknavy_color = imagecolorallocate($image, 0x00, 0x00, 0x50);$darkred_color  = imagecolorallocate($image, 0x90, 0x00, 0x00);//各份份量大小$value_array = array(12.5, 8.4, 79.1);$all_value = array_sum($value_array);$color_array = array($gray_color, $navy_color, $red_color);$drak_color_array = array($darkgray_color, $darknavy_color, $darkred_color);//先用暗色绘制30层for ($i = 80; $i > 50; $i--){$angle_begin = 0;$angle_end = 0;foreach ($value_array as $j=>$val){$angle_begin = $angle_end;$angle_end += $val * 360 / $all_value;imagefilledarc($image, 100, $i, 200, 100, $angle_begin, $angle_end, $drak_color_array[$j], IMG_ARC_PIE);}}//最上层再用亮色绘图,这样就有立体效果了。$angle_begin = 0;$angle_end = 0;foreach ($value_array as $j=>$val){$angle_begin = $angle_end;$angle_end += $val * 360 / $all_value;imagefilledarc($image, 100, $i, 200, 100, $angle_begin, $angle_end, $color_array[$j], IMG_ARC_PIE);}// flush imageheader('Content-type: image/png');imagepng($image);imagedestroy($image);?>  运行效果如下:
DSC0003.gif

  总体来说,PHP的绘图功能还是方便强大的,有需要的筒子们还可以试下PHPlot来绘图,其类库功能强大,使用也方便。
  
  
  转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7289686

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-358476-1-1.html 上篇帖子: PHP中PDO的使用方法总结 下篇帖子: PHP中GD库的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表