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"];
判斷:
若是想不區分大小寫,則可先統一轉換大小寫,再判斷