PHP 画图应用 验证码 柱状图
Title: PHP 画图应用 验证码 柱状图 Author: MoreWindows Blog: http://blog.csdn.net/MoreWindows KeyWord: PHP 验证码 柱状图 imagefilledarc 阅读本文之前,推荐先参阅姊妹篇《 PHP 画图基础 》。 本篇介绍如何使用PHP常用的绘图函数来生成验证码图片和柱
Title: PHP 画图应用 验证码 柱状图
Author: MoreWindows
Blog: http://blog.csdn.net/MoreWindows
KeyWord: PHP 验证码 柱状图 imagefilledarc
阅读本文之前,推荐先参阅姊妹篇《PHP 画图基础》。
本篇介绍如何使用PHP常用的绘图函数来生成验证码图片和柱状图。
一.验证码
在网站中验证码是非常有用的,下图就是一个含4个数字的验证码图片。
简单的验证码图片主要通过在正确内容上增加一些干扰的点和线。这种方法实现起来方便容易,作为示范,本文实现了一个随机字体(有10种字体文件),支持随机文字颜色,有干扰点,干扰线的验证码类,此类可以批量在磁盘上生成验证码图片并指定验证码由多少个数字多少个字母组成。具体功能可以参阅代码:
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 . "字节
"; else echo $verify_text . ".png生成失败
"; } } /* * 创建图片 */ 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 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 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 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张验证码图片,代码如下:
BatchVerifyPicture(6); ?>
生成的验证码效果如下所示:
当然还有很多特效可以加入的,如文字水波化、背景增加彩色小字母干扰等等,这些都可以有效的美化验证码图片。有需要的筒子们可以深入学习下,这里就不细究了。
注 程序所使用字体文件可以从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 画图基础》一文,柱状图原理很简单就是先用暗色绘制多层再用亮色绘制最上层,这样明暗对比就可以产生立体效果。具体过程可以参考下图:
再给出一个PHP根据各数据值来生成柱状图的示例代码:
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 image header('Content-type: image/png'); imagepng($image); imagedestroy($image); ?>
运行效果如下:
总体来说,PHP的绘图功能还是方便强大的,有需要的筒子们还可以试下PHPlot来绘图,其类库功能强大,使用也方便。
http://blog.csdn.net/morewindows/article/details/7289686