PHPプロット応用検証コード柱状図


Title:PHPプロットアプリケーション検証コード柱状図
Author:       MoreWindows
Blog:           http://blog.csdn.net/MoreWindows
KeyWord:PHP検証コード柱状図imagefilledarc
 
本文を読む前に、姉妹編「PHP画図基礎」を参照することをお勧めします.
この記事では、PHPでよく使用される図形描画関数を使用して、検証コードピクチャと柱状図を生成する方法について説明します.
一.検証コード
ウェブサイトでは認証コードが非常に役立ち、下図は4つの数字を含む認証コード画像です.

簡単な検証コードピクチャは、主に正確なコンテンツに干渉する点と線を追加することによって行われる.この方法は容易に実現でき、例として、ランダムな文字色、干渉点、干渉線のある検証コードクラスをサポートするランダムなフォント(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 />";
			else
				echo $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枚の検証コード画像を生成することができ、コードは以下の通りである.
<?php
require_once 'CSecurity_verify.php';
$test = new CSecurity_verify("D:\\", 4, 0);
$test->BatchVerifyPicture(6);
?>

生成された認証コードの効果は次のとおりです.
PHP 画图应用 验证码 柱状图_第1张图片
 
もちろん、文字の水波化、背景のカラーアルファベット干渉の増加など、多くの特効が加わることができ、検証コード画像を効果的に美化することができます.必要な筒があれば、深く勉強することができます.ここでは詳しく研究しません.
注プログラムで使用するフォントファイルは、C:WindowsFontsから選択し、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 画图应用 验证码 柱状图_第2张图片
さらに、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 image
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

実行効果は次のとおりです.
PHP 画图应用 验证码 柱状图_第3张图片
全体的には、PHPの描画機能は便利で強力で、必要な筒があればPHPlotを試して描画することもでき、そのクラスライブラリ機能は強く、使用も便利です.
 
 
転載は出典、原文住所を明記してください.http://blog.csdn.net/morewindows/article/details/7289686