PHP中圖像處理簡介

PHP圖形處理相關函數舉例

在PHP中有的圖形函數可以直接使用,但大多數函數需要安裝GD2函數庫才能使用。在Windows平臺下,安裝GD2庫很簡單,PHP5中自帶了GD2庫擴展(就是PHP的ext目錄下的php_gd2.dll文件)。運行phpinfo()頁面查看是否有GD的部分,如果有,說明已經安裝了GD2庫,如果沒有,說明安裝PHP時沒有安裝GD2庫。打開php.ini文件,查看文件中是否有一句“;extension=php_gd2.dll”,如果有則將其中的“;”去掉,再打開文件擴展目錄extension_dir的值設置成PHP的ext目錄所在的完整路徑,保存後重啓Apache即可。

PHP所能處理的圖像格式取決於所安裝的GD版本,以及其他GD可能用到的來訪問這些圖像格式的庫。低於gd-1.6版本的GD支持GIF格式,不支持PNG,高於gd-1.6低於gd-2.0.28的版本支持PNG,不支持GIF。在gd-2.0.28中又重新支持GIF。

目前的GD2庫支持JPEG、PNG、GIF、WBMP等文件格式。JPEG通常用來存儲照片或者具有豐富色彩和色彩層次的圖像,這種格式使用了有損壓縮,圖像質量有所破壞,由於這個原因,該格式不適合繪製線條、文本或顏色塊。GIF是圖形文件交換格式,廣泛應用於網絡,適合存儲包含文本、線條和簡單顏色塊的圖像。PNG是可移植的網絡圖像,該嘎是是無損壓縮,所以適合直線、文本或簡單顏色塊的圖像,由於GIF的專利原因,PNG在一段時間內是作爲GIF的替代品使用的。WBMP是專門爲無限通信設備設置的文件格式,但是沒有得到廣泛的發展。

一、創建圖形

在PHP中創建圖形的步驟有:創建一個背景、在背景中繪製圖形或輸入文本、輸出圖形、釋放所有資源。

注意在使用PHP輸出圖形時,一定要使用header()函數向瀏覽器發送頭信息,指定瀏覽器輸出相應格式的文件。若頭信息爲“Content-type:image/png”,表示瀏覽器將輸出PNG格式的圖片。如果在程序中輸出文本信息,則在瀏覽器中不會顯示。

1.創建背景圖形

創建背景可以使用imagecreate()和imagecreatetruecoloc()函數,這兩個函數都可以創建一個空白的圖形,並返回一個圖像標誌符,供其它函數使用。

resource imagecreate(int $x_size,int $y_size)

resource imagecreatetruecolor(int $x_size,int $y_size)

$x_size是背景的寬度,$y_size是背景的高度,imagecreate()函數用於建立一個基於調色板的圖形,創建後可改變背景顏色。imagecreatetruecolor()函數用於創建一個真彩色圖形,背景顏色默認爲黑色。如果創建成功,函數將返回一個句柄,如果失敗,並不會像其他函數一樣返回FALSE,這時可以使用die()函數來捕獲錯誤信息。類似imagecreate()的函數都可以使用die()函數來捕獲錯誤信息。

背景創建之後,就可以使用圖形函數在背景中繪製圖形或輸入文本。

2.使用已有圖片創建新圖形

imagecreatefromfig()函數可以根據已有的GIF圖形創建新圖形,imagecreatefromjpeg()函數可以根據已有的JPEG圖片創建新圖形,imagecreatefrompng()函數可以根據已有的PNG圖片創建新圖形。已有的圖片可以是遠程的圖片文件。

使用這些函數後已有的圖片將作爲新圖形的背景,之後的操作和imagecreate()函數創建背景圖形的操作方法一樣。

3.選擇顏色

顏色值得選擇需要使用imagecolorallocate()函數來完成。

int imagecolorallocate(resource $image,int $red,int $green,int $blue)

imagecolorallocate()函數返回一個標誌符,代表了由給定的紅、綠、藍(RBG)值組成的顏色。$red、$green、$blue分別是所需要的顏色的紅、綠、藍成分。這些參數是0~255的整數或者是十六進制的0x00~0xFF。imagecolorallocate()函數必須被調用以創建每一種用在$image所代表的圖形中的顏色。黑色(0,0,0)、紅色(255,0,0)、藍色(0,0,255)、白色(255,255,255)、綠色(0,255,0)。

4.輸出圖形

使用imagegif()函數可以將圖形以GIF格式輸出到瀏覽器或文件,image'jpeg()將圖形以JPEG格式輸出,imagepng()函數將圖形以PNG格式輸出。

bool imagepng(resource $image[,string $filename])

bool imagegif(resource $image[,string $filename])

bool imagejpeg(resource $image[,string $filename[,int $quality]])

$image是已經創建的圖像句柄,如果不提供參數$filename,則直接輸出原始圖形。如果提供參數$filename,則以$filename爲文件名創建一個相應格式的圖片,保存以後Web頁面中就可以使用該圖片了。imagejpeg()函數中的可選參數$quality,範圍從0(最差質量,文件最小)到100(最佳質量,文件最大).

不管輸出什麼格式的圖片,都要使用header()函數向瀏覽器發送相應的頭信息。如果要輸出GIF格式的圖片應使用:“header("Content-type:image/gif");”;輸出JPEG格式的圖片應使用“header("Content-type:image/jpeg");”;PNG格式使用“header("Content-type:image/png");”。

5.清除資源

爲了節省資源,圖片創建後返回的句柄如果不再使用,就要用imagedestory()函數來釋放與之相關的內存。

二、繪製圖形

1.繪製幾何圖形

(1)畫一個點

使用imagesetpixel()函數就可以在已經創建的背景圖形上畫一個單一像素,即一個點。

bool imagesetpixel(resource $image,int $x,int $y, int $color)

imagesetpixel()函數在已經創建的圖形$image上用$color顏色在($x,$y)座標上畫一個點。起始座標從左上角開始,座標爲(0,0),到右下角的座標爲($x_size,$y_size),其中$x_size和$y_size是背景圖形的寬和高。

(2)畫一條線段

使用imageline()函數可以畫出一條線段。

bool imageline(resource $image ,int $x1 ,$int $y1, int $x2, int $y2,int $color)

imageline()函數可以在已經創建的圖形$image上使用$color顏色畫出一條座標從($x1,$y1)到($x2,$y2)的線段。

(3)畫一個矩形

繪製矩形可以使用imagerectangle()函數來完成。

bool imagerectangle(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)

imagerectangle()函數在已經創建的圖形$image上使用$color顏色畫出一個矩形,矩形的左上角座標爲($x1,$y1),右上角座標爲($x2,$y2)。

(4)畫一個橢圓

使用imageellipse()函數可以畫一個橢圓。

bool imageellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color)

imageellipse()函數在圖形$image上畫一箇中心座標爲($cx,$cy)的橢圓。$w和$h分別指定了橢圓的寬度和高度,橢圓線條的顏色由$color指定。當橢圓的寬度和高度相等時,畫出的將是一個圓。

(5)畫一個橢圓弧

創建一個橢圓弧可以使用imagearc()函數

bool imagearc(resource $image,int $cx,int $cy,int $w,int $h,int $s,int $e, int $color)

imagearc()函數以座標($cx,$cy)爲中心在圖形$image上畫一個橢圓弧。$w和$h分別指定了橢圓的寬度和高度,當寬度和高度相等時,畫出來的就是圓弧。起始和結束點用$s和$e參數以角度指定。0度位於三點鐘位置,以順時針方向繪畫。

(6)畫一個多邊形

使用imagepolygon()函數可以畫出一個多邊形。

bool imagepolygon(resource $image,array $points,int $num_points,int $color)

imagepolygon()函數在$image中創建一個多邊形。$points是一個PHP數組,包含了多邊形的各個頂點座標。即$points[0]=x0,$points[1]=y0,$points[2]=x1,$points[3]=y1,以此類推。$num_points是頂點的總數。

2.輸出文本

(1)輸出一個字符

使用imagechar()函數可以在圖形上水平輸出一個字符。

bool imagechar(resource $image,int $font,int $x,int $y,string $c,int $colot)

函數用顏色$color將字符$c畫到$image的($x,$y)座標處(這是字符串左上角座標)。如果$c是一個字符串,則只輸出第一個字符。$font表示字符串的字體,如果值爲1~5中的一個數,則使用內置字體,值爲5時字體最大,爲1時最小。

imageup()函數可以垂直地輸出一個字符,用法與imagechar()函數相同。

(2)輸出字符串

使用imagestring()函數可以在已經創建的背景圖形上輸出字符串

bool imagestring(resource $image,int $font,int $x,int $y,string $s ,int $color)

函數用顏色$color將字符串$s畫到$image的($x,$y)座標處。

imagestringup()函數可以垂直地輸出字符串,用法與imagestring()函數相同.

imagestring()函數不支持中文顯示。

(3)使用指定字體輸出字符串

使用imagettftext()函數可以在輸出字符的同時指定輸出字符所使用的字體,並根據參數的不同輸出不同角度的字符串。

array imagettftext(resource $image,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text)

本函數使用顏色$color將字符串$text輸出到$image圖形的($x,$y)座標上,函數還可以使用$size參數指定字體的大小,使用$angle參數指定字體的角度,水平時角度爲0,沿逆時針變大。使用$fontfile參數指定想要使用的TrueType的字體文件,該文件必須是一個有效的字體文件,否則運行時會產生錯誤。

在Windows平臺下,字體文件全部位於C:\\Windows\Fonts目錄中,使用時可以將需要的字體文件複製到工作目錄中,或者直接指定字體文件的位置。

(4)輸出中文文字

中文字符不可以使用imagettftext()函數在圖片中直接輸出,如果要輸出中文字符,需要先使用iconv()函數對中文字符進行編碼。

string iconv(string $in_charset,string $out_charset,string $str)

參數$in_chatset是中文字符原來的字符集,$out_charset是編碼後的字符集,$str是需要轉換的中文字符串。函數最後返回編碼後的字符串。這是使用imagettftext()函數就可以在圖片中輸出中文了。

3.繪製帶填充色的幾何圖形

在PHP中可以使用imagefill()函數對某一區域進行顏色填充。

bool imagefill(resource $image,int $x,int $y,int $color)

函數在$image圖形的座標($x,$y)處用顏色$color執行區域填充,即與($x,$y)點顏色相同且相鄰的點都會被填充上該顏色。

推薦使用imagecreatecolor()函數來創建圖形。

使用imagefill()函數填充顏色時要計算填充點,這是一件很麻煩的事。PHP可以在畫幾何圖形的時候就將幾何圖形填充爲指定顏色。

(1)畫一個矩形並填充

使用imagefilledrectangle()函數可以畫一個矩形,並使用指定顏色填充該矩形。

bool imagefilledrectangle(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)

imagefilledrectangle()函數的$color參數指定的是整個矩形區域的顏色。

函數imagefilledpolygon()可以畫一個多邊形並填充顏色。

(2)畫一個橢圓並填色

使用imagefilledellipse()函數可以在已經創建的圖形上畫一個橢圓,並使用指定顏色進行填充。

bool imagefilledellipse(resource $image, int $cx ,int $cy,int $w,int $h, int $color)

(3)畫一個橢圓弧並填色

函數imagefilledarc()函數可以畫一個橢圓弧並填充顏色。

bool imagefilledarc(resource $image,int $cx,int $cy,int $w,int $h,int $s,int $e,int $color,int $style)

在$image中以座標($cx,$cy)爲中心畫一個橢圓弧。如果成功則返回TRUE,失敗則返回FALSE。$w和$h分別指定了橢圓的寬和高,$s和$e參數以角度指定了起始和結束點。$style指定了橢圓弧畫出來的效果,值可以是以下幾個:IMG_ARC_PIE(產生圓形邊界)、IMG_ARC_CHORD(用直線連接起始和結束點)、IMG_ARC_NOFILL(指明弧或弦只有輪廓,不填充)和IMG_ARC_EDGED(用直線將起始和結束點與中心點相連)。$style的值可以一起使用,不過當IMG_ARC_PIE和IMG_ARC_CHORD一起使用時,只有IMG_ARC_CHORD將起作用。IMG_ARC_EDGED和IMG_ARC_NOFILL一起使用是畫餅狀圖輪廓的好方法。

pi()函數的作用是返回圓周率的值,cos()函數和sin()函數的作用是返回一個弧度的餘弦值和正弦值。number_format()函數的作用是格式化一個浮點數。

string number_format(float $number[,int $decimals[,string $dec_point[,string $thousands_sep]]])

參數$number是要格式化的浮點數:參數$decimals指定返回的小數的位數,若省略則只返回整數部分;$dec_point表示小數點的表示方式,默認值是“.”;參數$thousands_sep爲整數部分每三位的分隔符號,默認值是“.”。

三、圖形的處理

1.顏色處理

(1)指定顏色填充

使用imagefilltoborder()函數可以爲指定點進行顏色填充,如果遇到指定顏色的邊界時,則停止填充。

bool imagefilltoborder(resource $image,int $x,int $y,int $border,int $color)

該函數從座標($x,$y)開始用$color顏色執行區域填充,知道碰到顏色爲$border的邊界爲止。邊界內的所有顏色都會被填充。

如果指定的邊界色和該點顏色相同,則沒有填充。如果圖像中沒有該邊界色,則整幅圖像都會被填充。

(2)定義透明色

使用imagecolorallocatealpha()函數也可以爲指定的圖形分配顏色,還可以設置顏色的透明度。

int imagecolorallocatealpha(resource $image, int $red,int $green,int $blue,int $alpha)

$alpha參數用於設置顏色的透明度,其值從0到127。0表示完全不透明,127表示完全透明。

2.複製圖片的一部分

使用imagecopy()函數能夠複製圖片的一部分到另一個圖片。

bool imagecopy(resource $dst_im,resource $src_im,int $dst_x,int $dst_y,int $src_x,int $src_y,int $src_w,int $src_h)

將$src_im中座標從($src_x,$src_y)開始,寬度爲$src_w,高度爲$src_h的一部分複製到$dst_im中座標爲($dst_x,$dst_y)的位置上。

3.複製圖片並調整大小

使用imagecopyresized()函數也可以實現imagecopy()函數的功能,並可以對複製的圖片大小進行調整。

bool imagecopyresized(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)

$dst_w和$dst_h這兩個參數表示將複製的圖片寬度和高度分別調整爲$dst_w和$dst_h,即實現了圖片的縮放功能。

imagesx()和imagesy()函數的作用是獲取一個圖像的寬度和高度,他們的參數是已經創建的圖像句柄。

4.旋轉圖像

使用imagerotate()函數可以將圖像旋轉給定角度

resource imagerotate(resource $src_im,float $angle,int $bgd_color[,int $ignore_transparent])

參數$src_im是給定的圖像,$angle是指定的旋轉角度,$bgd_color指定了旋轉後沒有覆蓋到的部分的顏色。旋轉的中心是圖像的中心,旋轉後的圖像會按比例縮小以適合目標圖像的大小,邊緣不會被剪去。可選參數$ignore_transparent若被設爲非零值,則透明色會被忽略(否則會被保留)。

四、其他的圖形函數

1.取得圖形信息

getimagesize()函數可以獲取指定圖形的尺寸、寬度、高度和類型等信息。該函數將這些信息以數組的形式返回,如果圖片指定的圖形不是有效的文件,則返回FALSE。

2.設定畫線

使用imagesetthickness()函數可以設置畫幾何圖形時畫線的寬度。

bool imagesetthickness(resource $image,int $thickness)

該函數將畫線寬度設爲$thickness個像素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章