PHP驗證碼生成及圖片處理(GD庫)

GD庫是php處理圖形的擴展庫,GD庫提供了一系列用來處理圖片的API,使用GD庫能夠處理圖片,或者生成圖片,也能夠給圖片加水印。php

本章實現了生成圖片並繪畫各類形狀、圖片的壓縮、中文字符水印及圖片水印、基本驗證碼的生成和使用。對強大的GD庫有基本的瞭解和使用。算法

 

 GD庫支持的圖片格式:session

PNG:函數

生成的圖片顯示顯示最好post

是一種無損壓縮的位圖片形格式字體

GIF:this

生成的圖片顯示顯示較好spa

GIF是一種基於LZW算法的連續色調的無損無損壓縮格式
code

JPEG:orm

一種標準的壓縮名稱,一般用來存儲照片或者存儲具備豐富色彩和色彩層次的圖像,格式使用了有損壓縮。

.....

 

各類圖形繪畫和文字顯示:

 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"];

 判斷:

若是想不區分大小寫,則可先統一轉換大小寫,再判斷

相關文章
相關標籤/搜索