PHP验证码生成及图片处理(GD库)
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印。
本章实现了生成图片并绘画各种形状、图片的压缩、中文字符水印及图片水印、基本验证码的生成和使用。对强大的GD库有基本的了解和使用。
GD库支持的图片格式:
PNG:
生成的图片显示显示最好
是一种无损压缩的位图片形格式
GIF:
生成的图片显示显示较好
JPEG:
一种标准的压缩名称,通常用来存储照片或者存储具有丰富色彩和色彩层次的图像,格式使用了有损压缩。
.....
各种图形绘画和文字显示:
1 //创建资源,一个画板,参数(长宽) 2 $cour=imagecreatetruecolor(500,500); 3 4 //创建一个颜色,参数(图片资源,R,G,B) 5 $color_B=imagecolorallocate($cour,0,0,255); 6 $color_R=imagecolorallocate($cour,255,0,0); 7 $color_G=imagecolorallocate($cour,0,255,0); 8 $color_RGB=imagecolorallocate($cour,255,255,255); 9 10 //区域填充颜色,参数(图片资源,x,y,颜色) 11 //只要坐标在区域范围,则当前区域会被填充 12 imagefill($cour,0,0,$color_RGB); 13 14 //画直线,参数(图片资源,起始x,起始y,终点x,终点y,颜色) 15 imageline($cour,10,20,100,100,$color_R); 16 17 //矩形,参数(图片资源,左上角x,y,右下角x,y,颜色) 18 //非填充 19 imagerectangle($cour,20,50,50,100,$color_G); 20 //填充 21 imagefilledrectangle($cour,50,20,100,50,$color_G); 22 23 //椭圆,圆,参数(资源,中心点x,y,长,高,颜色) 24 imageellipse($cour,100,100,50,50,$color_R); 25 imagefilledellipse($cour,50,50,50,50,$color_R); 26 27 //弧形,参数(椭圆参数,起始角度,结束角度,颜色) 28 imagearc($cour,120,110,50,50,-180,0,$color_G); 29 //imagefilledarc() 30 31 //画字 32 $strx="DONGxiaoDONG"; 33 //横向画 34 imagestring($cour,5,330,330,$strx,$color_R); 35 36 //参数,(图像资源,大小,旋转,起始x,y,颜色,字体,内容) 37 $strx1="东小东"; 38 imagettftext($cour,10,5,200,300,$color_G,"font/xy.ttf",$strx1); 39 40 41 42 //保存,imagepng,imagegif,imagejpeg 43 //jpeg最差,gif适中,png推荐 44 imagejpeg($cour,"xxx.jpg"); 45 46 //销毁资源 47 imagedestroy($cour);
图片的压缩及裁剪:
1 <?php 2 3 //可以传递任意gif,png,jpeg格式图片 4 5 function openimg($strimg){ 6 //得到图片信息,宽,高,类型 7 $imgmm=getimagesize($strimg); 8 //print_r($imgmm); 9 list($w,$h,$typex)=$imgmm; 10 //图片类型为1,2,3,所以需要0占位 11 $arrType=array("占位/必须","gif","jpeg","png"); 12 //得到需要使用的函数 13 $createimg="imagecreatefrom".$arrType[$typex]; 14 //得到图片资源 15 $cour=$createimg($strimg); 16 17 18 //创建一个颜色,参数(图片资源,R,G,B) 19 20 $color_R=imagecolorallocate($cour,255,0,0); 21 22 23 //参数,(图像资源,大小,旋转,起始x,y,颜色,字体,内容) 24 $strx1="东小东"; 25 imagettftext($cour,20,0,$w-100,$h-100,$color_R,"font/xy.ttf",$strx1); 26 27 $destw=100; 28 $desth=100; 29 30 //缩放 31 $destimg=imagecreatetruecolor($destw,$desth); 32 33 //--------等比列----------------------------------- 34 if($destw&&($w<$h)){ 35 $destw=($desth/$h)*$w; 36 }else{ 37 $desth=($destw/$w)*$h; 38 } 39 //------------------------------------------- 40 41 //去掉黑边区域 42 $color=imagecolorallocate($destimg,255,255,255); //2.上色 43 imagecolortransparent($destimg,$color); //3.设置透明色 44 imagefill($destimg,0,0,$color);//4.填充透明色 45 46 //参数(需输出资源,原资源,目标起始点(x,y),原起始点,目标长高,原长高) 47 48 imagecopyresampled($destimg,$cour,0,0,0,0,$destw,$desth,$w,$h); 49 //剪切,函数相同,注意原大小应设置为目标大小 50 //imagecopyresampled($destimg,$cour,0,0,50,50,$destw,$desth,$destw,$desth); 51 52 53 //保存,与打开相似 54 $imgsave="image".$arrType[$typex]; 55 $imgsave($cour,$strimg); 56 $imgsave($destimg,"new".$strimg); 57 echo "<img src=$strimg>"; 58 echo "<img src='new$strimg'>"; 59 60 //销毁资源 61 imagedestroy($cour); 62 imagedestroy($destimg); 63 64 65 } 66 67 //调用函数 68 $cour=openimg("zcy.gif");
文字及图片水印的生成:
1 //可以传递任意gif,png,jpeg格式图片 2 3 function openimg($strimg){ 4 //得到图片信息,宽,高,类型 5 $imgmm=getimagesize($strimg); 6 //print_r($imgmm); 7 list($w,$h,$typex)=$imgmm; 8 //图片类型为1,2,3,所以需要0占位 9 $arrType=array("占位/必须","gif","jpeg","png"); 10 //得到需要使用的函数 11 $createimg="imagecreatefrom".$arrType[$typex]; 12 //得到图片资源 13 $cour=$createimg($strimg); 14 15 16 //创建一个颜色,参数(图片资源,R,G,B) 17 $color_R=imagecolorallocate($cour,255,0,0); 18 19 //文字水印 20 //参数,(图像资源,大小,旋转,起始x,y,颜色,字体,内容) 21 $strx1="东 小 东"; 22 //长度除以3,是因为中文utf8占3个字节 23 //计算字符串整体宽高 24 $fontw=strlen($strx1)/3*imagefontwidth(7); 25 $fonth=imagefontheight(7); 26 imagettftext($cour,7,0,$w-$fontw-10,$h-$fonth,$color_R,"font/xy.ttf",$strx1); 27 28 //图片水印 29 $watermark=imagecreatefromgif("zcy.gif"); 30 //得到图片信息,宽,高,类型 31 $imgmmx=getimagesize("zcy.gif"); 32 list($ww,$hh)=$imgmmx; 33 //绘制图片水印,参数(原图片资源,水印图片资源,原图片开始位置x,y,水印图片开始x,y,宽,高) 34 imagecopy($cour,$watermark,10,10,0,0,$ww,$hh); 35 36 37 //保存,与打开相似 38 $imgsave="image".$arrType[$typex]; 39 $imgsave($cour,"new".$strimg); 40 echo "<img src=new$strimg>"; 41 42 //销毁资源 43 imagedestroy($cour); 44 imagedestroy($watermark); 45 46 } 47 48 49 //调用函数 50 $cour=openimg("xxx.png");
验证码的生成及使用详细:
创建:
1 <?php 2 3 //创建资源,一个画板,参数(长高) 4 $cour=imagecreatetruecolor(80,30); 5 6 //创建一个颜色,参数(图片资源,R,G,B) 7 $color_B=imagecolorallocate($cour,0,0,100); 8 $color_R=imagecolorallocate($cour,255,0,0); 9 $color_G=imagecolorallocate($cour,0,255,0); 10 $color_RGB=imagecolorallocate($cour,255,255,255); 11 12 //区域填充颜色,参数(图片资源,x,y,颜色) 13 //随机背景颜色 14 $color_TB=imagecolorallocate($cour,rand(200,255),rand(100,150),rand(200,255)); 15 imagefill($cour,0,0,$color_TB); 16 17 //画直线,参数(图片资源,起始x,起始y,终点x,终点y,颜色) 18 imageline($cour,10,0,30,20,$color_R); 19 imageline($cour,0,15,80,6,$color_R); 20 21 //矩形,参数(图片资源,左上角x,y,右下角x,y,颜色) 22 //非填充 23 imagerectangle($cour,0,0,80-1,30-1,$color_G); 24 25 26 //生成验证码随机字符 27 $codes="3456789abcdefghkmnpqrstvuywzABCDEFGHIGKLMNPQRSTVUYWZ"; 28 $endcode=""; 29 for($i=0;$i<4;$i++){ 30 $endcode.=$codes[rand(0,strlen($codes)-1)]; 31 } 32 33 34 35 //参数,(图像资源,大小,旋转,起始x,y,颜色,字体,内容) 36 $strx1="东小".$endcode; 37 38 39 //加粗 40 imagettftext($cour,10,2,10,20,$color_RGB,"font/xy.ttf",$strx1); 41 imagettftext($cour,10,2,10,20,$color_R,"font/xy.ttf",$strx1); 42 imagettftext($cour,10,2,11,20,$color_B,"font/xy.ttf",$strx1); 43 44 //保存验证码信息到session 45 session_start(); 46 $_SESSION["codex"]=$strx1; 47 48 //输出,imagepng,imagegif,imagejpeg 49 header("Content-type:image/png"); 50 imagepng($cour); 51 //销毁资源 52 imagedestroy($cour);
显示:
1 <form action="lai.php" method="post" enctype="multipart/form-data"> 2 3 <input type="text" name="codeyy"> 4 <br> 5 <!--实现点击就更换一张--> 6 <img src="wan.php" onClick="this.src='wan.php'"> 7 <br/> 8 <input type="submit" value="东小东上传"> 9 </form>
获取:
1 session_start(); 2 echo "验证码字符串为:".$_SESSION["codex"]."<br/>"; 3 echo "输入的验证码为:".$_POST["codeyy"];
判断:
如果想不区分大小写,则可先统一转换大小写,再判断