1. 程式人生 > >php GD庫的使用

php GD庫的使用

兩大功能:自己畫,對於原有圖片改變

PHP中GD庫的使用


    PHP 不僅限於只產生 HTML 的輸出,還可以建立及操作多種不同格式的影象檔案。PHP提供了一些內建的影象資訊函式,也可以使用GD函式庫建立新影象或處理已有的影象。目前GD2庫支援GIF、JPEG、PNG和WBMP等格式。此外還支援一些FreeType(載入作業系統中的字型)、Type1等字型庫。三種都有用的
JPEG 是一種壓縮標準的名字,通常是用來儲存照片或者儲存具有豐富色彩和色彩層次的影象。這種格式使用了有失真壓縮。
PNG 是可移植的網路影象,對影象採用了無損壓縮標準。
GIF 原義是“影象互換格式”,是一種基於LZW演算法的連續色調的無失真壓縮格式 。

此外需要自行安裝GD庫(wamp自帶,linux裝好麻煩),還有一種畫圖的庫叫做ImageMagick,可以用於大網站,功能比GD庫更全,運用難度差不多,14年的時候用的不多,不知道現在咋樣==

這裡面的函式會用就好,不用都背

使用GD庫畫圖

步驟:

在PHP中建立一個影象應該完成如下所示的4個步驟:
1.建立一個背景影象(也叫畫布),以後的操作都基於此背景影象。
2.在背景上繪製圖像輪廓或輸入文字。
3.輸出最終圖形
4.釋放資源

畫布管理

imagecreate -- 新建一個基於調色盤的影象
resource imagecreate ( int x_size, int y_size )
本函式用來建立空新畫布,引數為圖片大小,單位為畫素 (pixel)。支援256色。
imagecreatetruecolor -- 新建一個真彩色影象
resource imagecreatetruecolor ( int x_size, int y_size )
新建一個真彩色影象畫布 ,需要 GD 2.0.1 或更高版本,不能用於 GIF 檔案格式。
imagedestroy -- 銷燬一影象
bool imagedestroy ( resource image )
imagedestroy() 釋放與 image 關聯的記憶體。

設定顏色

imagecolorallocate -- 為一幅影象分配顏色
語法:int imagecolorallocate ( resource image, int red, int green, int blue )
imagecolorallocate() 返回一個識別符號,代表了由給定的 RGB 成分組成的顏色。red,green 和 blue 分別是所需要的顏色的紅,綠,藍成分。這些引數是 0 到 255 的整數或者十六進位制的 0x00 到 0xFF。imagecolorallocate() 必須被呼叫以建立每一種用在 image 所代表的影象中的顏色。

生成圖片


imagegif -- 以 GIF 格式將影象輸出到瀏覽器或檔案
語法:bool imagegif (resource image [,string filename] )
imagejpeg -- 以 JPEG 格式將影象輸出到瀏覽器或檔案
語法:bool imagejpeg (resource image [,string filename [, int quality]] )
imagepng -- 以 PNG 格式將影象輸出到瀏覽器或檔案
語法:bool imagepng (resource image [,string filename] )
imagewbmp -- 以 WBMP 格式將影象輸出到瀏覽器或檔案
語法:bool imagewbmp (resource image [, string filename [, int foreground]] )

<?php
	$img=imagecreatetruecolor(200,200);
	$white=imagecolorallocate($img,0xFF,0xFF,0xFF);
	$red=imagecolorallocate($img,255,0,0);
	$blue=imagecolorallocate($img,255,255,255);
	imagefill($img,0,0,$white);
	imageline($img,0,0,200,200,$blue);
	imageline($img,200,0,0,200,$red);
	header("Content-Type:images/png");
	imagePng($img);//第二個引數是輸出圖片到資料夾 P大寫!!
	imagedestroy($img);

效果

使用GD庫繪製各種常見圖形

弱弱的吐槽一下函式名,和c#有什麼區別嘛~

imagefill -- 區域填充
語法:bool imagefill(resource image,int x,int y, int color)
imagefill() 在 image 影象的座標 x,y(影象左上角為 0, 0)處用 color 顏色執行區域填充(即與 x, y 點顏色相同且相鄰的點都會被填充)。
imagesetpixel -- 畫一個單一畫素
語法:bool imagesetpixel ( resource image, int x, int y, int color )
imagesetpixel() 在 image 影象中用 color 顏色在 x,y 座標(影象左上角為 0,0)上畫一個點。
imageline -- 畫一條線段
語法:bool imageline ( resource image, int x1, int y1, int x2, int y2, int color )
imageline() 用 color 顏色在影象 image 中從座標 x1,y1 到 x2,y2(影象左上角為 0, 0)畫一條線段。

imagerectangle -- 畫一個矩形
語法:bool imagerectangle ( resource image, int x1, int y1, int x2, int y2, int col )
imagerectangle() 用 col 顏色在 image 影象中畫一個矩形,其左上角座標為 x1, y1,右下角座標為 x2, y2。影象的左上角座標為 0, 0。
imagefilledrectangle -- 畫一矩形並填充
語法:bool imagefilledrectangle ( resource image, int x1, int y1, int x2, int y2, int color )
imagefilledrectangle() 在 image 影象中畫一個用 color 顏色填充了的矩形,其左上角座標為 x1,y1,右下角座標為 x2,y2。0, 0 是影象的最左上角。

imageellipse -- 畫一個橢圓
語法:bool imageellipse ( resource image, int cx, int cy, int w, int h, int color )
imageellipse() 在 image 所代表的影象中畫一箇中心為 cx,cy(影象左上角為 0, 0)的橢圓。w 和 h 分別指定了橢圓的寬度和高度,橢圓的顏色由 color 指定。
imagefilledellipse -- 畫一橢圓並填充
語法:bool imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color )
imagefilledellipse() 在 image 所代表的影象中以 cx,cy(影象左上角為 0, 0)為中心畫一個橢圓。w 和 h 分別指定了橢圓的寬和高。橢圓用 color 顏色填充。如果成功則返回 TRUE,失敗則返回 FALSE。

imagearc -- 畫橢圓弧
bool imagearc ( resource image, int cx, int cy, int w, int h, int s, int e, int color )
imagearc() 以 cx,cy(影象左上角為 0, 0)為中心在 image 所代表的影象中畫一個橢圓弧。w 和 h 分別指定了橢圓的寬度和高度,起始和結束點以 s 和 e 引數以角度指定。0°位於三點鐘位置,以順時針方向繪畫。
imagefilledarc -- 畫一橢圓弧且填充
bool imagefilledarc ( resource image, int cx, int cy, int w, int h, int s, int e, int color, int style )
imagefilledarc() 在 image 所代表的影象中以 cx,cy(影象左上角為 0, 0)畫一橢圓弧。如果成功則返回 TRUE,失敗則返回 FALSE。w 和 h 分別指定了橢圓的寬和高,s 和 e 引數以角度指定了起始和結束點。style 可以是下列值按位或(OR)後的值:
IMG_ARC_PIE        IMG_ARC_CHORD
IMG_ARC_NOFILL        IMG_ARC_EDGED

imagestring -- 水平地畫一行字串
語法:bool imagestring ( resource image, int font, int x, int y, string s, int col )
imagestring() 用 col 顏色將字串 s 畫到 image 所代表的影象的 x,y 座標處(這是字串左上角座標,整幅影象的左上角為 0,0)。如果 font 是 1,2,3,4 或 5,則使用內建字型。
imagestringup -- 垂直地畫一行字串
語法:bool imagestringup ( resource image, int font, int x, int y, string s, int col )
imagestring()用 col 顏色將字串 s 垂直地畫到 image 所代表的影象的 x, y 座標處(影象的左上角為 0, 0)。如果 font 是 1,2,3,4 或 5,則使用內建字型。

imagechar -- 水平地畫一個字元 (用來做驗證碼)
語法:bool imagechar ( resource image, int font, int x, int y, string c, int color )
imagechar() 將字串 c 的第一個字元畫在 image 指定的影象中,其左上角位於 x,y(影象左上角為 0, 0),顏色為 color。如果 font 是 1,2,3,4 或 5,則使用內建的字型(更大的數字對應於更大的字型)。
imagecharup -- 垂直地畫一個字元
語法:bool imagecharup ( resource image, int font, int x, int y, string c, int color )
imagecharup() 將字元 c 垂直地畫在 image 指定的影象上,位於 x,y(影象左上角為 0, 0),顏色為 color。如果 font 為 1,2,3,4 或 5,則使用內建的字型。
imagettftext -- 用 TrueType 字型向影象寫入文字
語法 :array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

<?php
	$img=imagecreatetruecolor(200,200);
	$white=imagecolorallocate($img,0xFF,0xFF,0xFF);
	$red=imagecolorallocate($img,255,0,0);
	$blue=imagecolorallocate($img,0,0,0xFF);
	$pink=imagecolorallocate($img,0xFF,0,0xFF);
	$green=imagecolorallocate($img,0,0xFF,0);
	imagefill($img,0,0,$white);
	imageline($img,0,0,200,200,$blue);
	imageline($img,200,0,0,200,$red);
	imagerectangle($img,50,50,150,150,$blue);
	imagefilledrectangle($img,75,75,125,125,$pink);
	imageellipse($img,50,50,150,150,$red);
	imagefilledellipse($img,50,50,150,150,$pink);
	imagearc($img,150,50,100,100,-90,0,$red);
	imagestring($img,5,100,150,"hello world",$red);
	imagestringup($img,5,150,100,"hello world",$red); 
	imagettftext($img,20,0,20,100,$green,"./simkai.ttf","MissZhou加油啊");
	//字型的名字必須是英文的,我用漢儀雪君體就不成功==
	header("Content-Type:images/png");
	imagePng($img);//第二個引數是輸出圖片到資料夾 P大寫!!
	imagedestroy($img);
	

綜合案例:畫時鐘
<body>
	<img id="time" src="test3.php" />


	<script>
		setInterval(function(){
				document.getElementById("time").src="test3.php?"+Math.random();
				
			},1000);
	</script>	
</body>

<?php
	//獲取系統時間
	date_default_timezone_set("PRC");

	$h = date("H");
	$i = date("i");
	$s = date("s");

	//1 建立資源(畫布的大小)
	$img = imagecreatetruecolor(200, 250);	
	//設定畫布的顏色
	$white =  imagecolorallocate($img, 0xFF, 0xFF, 0xFF);
	$red =  imagecolorallocate($img, 255, 0, 0);
	$blue =  imagecolorallocate($img, 0, 0, 0XFF);
	$pink =  imagecolorallocate($img, 0XFF, 0, 0XFF);
	$green =  imagecolorallocate($img, 0, 0xFF, 0);
	imagefill($img, 0, 0, $white);
	//2. 製作各種顏色
	imageellipse($img, 100, 100, 190, 190, $blue);
	imagefilledellipse($img, 100, 100, 4, 4, $blue);
	imagestring($img, 3, 95, 8,  "12", $blue);
	imagestring($img, 3,180, 95, "03", $blue);
	imagestring($img, 3, 95, 180,  "06", $blue);
	imagestring($img, 3, 11, 95,  "09", $blue);
	//秒針
	$len = 80;
	 $a = $len*sin(pi()/30*$s);
	 $b = $len*cos(pi()/30*$s);
	$x = 100 + $a;
	$y = 100 - $b;
        imageline($img, 100, 100, $x, $y, $red);
	//數字的時間
	imagestring($img, 5, 20, 230, "NOW: {$h}:{$i}:{$s}", $red);
	//4儲存,或輸出給瀏覽, 寫第二個引數就是儲存
	header("Content-Type:images/gif");
	imagegif($img);
	//5. 釋放資源
	imagedestroy($img);

PHP圖片處理

從指定的圖片檔案或 URL地址來新建一個影象。成功則返回一個影象識別符號,失敗時返回一個空字串,並且輸出一條錯誤資訊。由於格式不同,則需要分別使用對應圖片背景處理函式。
resource imagecreatefrompng ( string filename ) 從 PNG 檔案或 URL 新建一影象
resource imagecreatefromjpeg ( string filename )
    從 JPEG 檔案或 URL 新建一影象
resource imagecreatefromgif ( string filename )
    從 GIF 檔案或 URL 新建一影象  
resource imagecreatefromwbmp ( string filename ) 從 WBMP 檔案或 URL 新建一影象

<?php
	$img=imagecreatefrompng("./cx.png");//一定要對應!!
	$color=imagecolorallocate($img,0,255,0);
	imageline($img,0,0,200,200,$color);
	imagepng($img,"ncx.png");
	imagedestroy($img);
等同於:
<?php
	$img=imagecreatefrompng("./cx.png");
	$color=imagecolorallocate($img,0,255,0);
	imageline($img,0,0,imagesx($img),imagesy($img),$color);
	imagepng($img,"ncx.png");
	imagedestroy($img);
	

存貯影象資訊:
<?php
	$img=imagecreatefrompng("./cx.png");
	list($width,$height,$type)=getimagesize("./cx.png");
	$color=imagecolorallocate($img,0,255,0);
	imageline($img,0,0,imagesx($img),imagesy($img),$color);
	imagepng($img,"ncx.png");
	imagedestroy($img);
	


其他影象處理函式:
int imagesx ( resource image )
    取得影象寬度

int imagesy ( resource image )
    取得影象高度
 
array getimagesize ( string $filename [, array &$imageinfo ] )
    取得影象大小、型別等資訊

一般化處理影象

<?php
	function cimgstr($imgname, $string) {
		list($width, $height, $type)= getimagesize($imgname);

		$types = array(1=>"gif", 2=>"jpeg", 3=>"png");

		//變數函式
		$createimage = "imagecreatefrom".$types[$type];

		$img = $createimage($imgname);
		
		$red =  imagecolorallocate($img, 0xFF, 0, 0);

		
		$x = ($width-imagefontwidth(5)*strlen($string))/2;
		$y = ($height-imagefontheight(5))/2;


		imagestring($img, 5, $x, $y, $string, $red);
		
		//變數函式
		$save = "image".$types[$type];
		$save($img, "new_".$imgname);
		imagedestroy($img);
	}


	cimgstr("dx.jpg", "meizi");
	cimgstr("map.gif", "meizi");
	cimgstr("cx.png", "meize");

	

圖片縮放和裁剪


bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
        重取樣拷貝部分影象並調整大小,是將一幅影象中的一塊正方形區域拷貝到另一個影象中,平滑地插入畫素值,因此,尤其是,減小了影象的大小而仍然保持了極大的清晰度。成功時返回 TRUE, 或者在失敗時返回 FALSE。其中dst_image 和 src_image 分別是目標影象和源影象的識別符號。