PHP中GD庫的使用
GD簡(jiǎn)介
PHP 不僅限于只產(chǎn)生 HTML 的輸出体捏,還可以創(chuàng)建及操作多種不同格式的圖像文件冠摄。PHP提供了一些內(nèi)置的圖像信息函數(shù),也可以使用GD函數(shù)庫創(chuàng)建新圖像或處理已有的圖像几缭。目前GD2庫支持GIF河泳、JPEG、PNG和WBMP等格式年栓。此外還支持一些FreeType拆挥、Type1等字體庫。
JPEG 是一種壓縮標(biāo)準(zhǔn)的名字某抓,通常是用來存儲(chǔ)照片或者存儲(chǔ)具有豐富色彩和色彩層次的圖像纸兔。這種格式使用了有損壓縮。
PNG 是可移植的網(wǎng)絡(luò)圖像否副,對(duì)圖像采用了無損壓縮標(biāo)準(zhǔn)汉矿。
GIF 原義是“圖像互換格式”,是一種基于LZW算法的連續(xù)色調(diào)的無損壓縮格式 副编。
在PHP中創(chuàng)建一個(gè)圖像應(yīng)該完成如下所示的4個(gè)步驟:
創(chuàng)建一個(gè)背景圖像(也叫畫布)负甸,以后的操作都基于此背景圖像流强。
在背景上繪制圖像輪廓或輸入文本。
輸出最終圖形
釋放資源
<?php
//1. 創(chuàng)建畫布
$im = imageCreateTrueColor(200, 200); //建立空白背景
$white = imageColorAllocate ($im, 255, 255, 255); //設(shè)置繪圖顏色
$blue = imageColorAllocate ($im, 0, 0, 64);
//2. 開始繪畫
imageFill($im, 0, 0, $blue); //繪制背景
imageLine($im, 0, 0, 200, 200, $white); //畫線
imageString($im, 4, 50, 150, 'Sales', $white); //添加字串
//3. 輸出圖像
header('Content-type: image/png');
imagePng ($im); //以 PNG 格式將圖像輸出
//4. 釋放資源
imageDestroy($im);
?>
畫布管理
- imagecreate -- 新建一個(gè)基于調(diào)色板的圖像
resource imagecreate ( int x_size, int y_size )
本函數(shù)用來建立空新畫布呻待,參數(shù)為圖片大小打月,單位為像素 (pixel)。支持256色蚕捉。
-
imagecreatetruecolor
-- 新建一個(gè)真彩色圖像
resource imagecreatetruecolor ( int x_size, int y_size )
新建一個(gè)真彩色圖像畫布 奏篙,需要 GD 2.0.1 或更高版本,不能用于 GIF 文件格式迫淹。
-
imagedestroy
-- 銷毀一圖像
bool imagedestroy ( resource image )
imagedestroy() 釋放與 image 關(guān)聯(lián)的內(nèi)存秘通。
設(shè)置顏色
-
imagecolorallocate
-- 為一幅圖像分配顏色
語法:int imagecolorallocate ( resource image, int red, int green, int blue )
imagecolorallocate() 返回一個(gè)標(biāo)識(shí)符,代表了由給定的 RGB 成分組成的顏色敛熬。red肺稀,green 和 blue 分別是所需要的顏色的紅,綠应民,藍(lán)成分话原。
這些參數(shù)是 0 到 255 的整數(shù)或者十六進(jìn)制的 0x00 到 0xFF。
imagecolorallocate() 必須被調(diào)用以創(chuàng)建每一種用在 image 所代表的圖像中的顏色
$im = imagecreatetruecolor(100, 100); //創(chuàng)建畫布的大小為100x100
$red = imagecolorallocate($im, 255, 0, 0); //由十進(jìn)制整數(shù)設(shè)置一個(gè)顏色
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF); // 十六進(jìn)制方式
-
imagepolygon
-- 畫一個(gè)多邊形
語法:bool imagepolygon ( resource image, array points, int num_points, int color )
imagepolygon() 在圖像中創(chuàng)建一個(gè)多邊形诲锹。points 是一個(gè) PHP 數(shù)組繁仁,包含了多邊形的各個(gè)頂點(diǎn)坐標(biāo),即 points[0] = x0归园,points[1] = y0黄虱,points[2] = x1,points[3] = y1庸诱,以此類推捻浦。num_points 是頂點(diǎn)的總數(shù)。
-
imagefilledpolygon
-- 畫一多邊形并填充
語法:bool imagefilledpolygon ( resource image, array points, int num_points, int color )
imagefilledpolygon() 在 image 圖像中畫一個(gè)填充了的多邊形桥爽。points 參數(shù)是一個(gè)按順序包含有多邊形各頂點(diǎn)的 x 和 y 坐標(biāo)的數(shù)組默勾。 num_points 參數(shù)是頂點(diǎn)的總數(shù),必須大于 3聚谁。
生成圖像
-
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]] )
繪制圖像
-
imagefill
-- 區(qū)域填充
語法:bool imagefill(resource image,int x,int y, int color)
imagefill() 在 image 圖像的坐標(biāo) x,y(圖像左上角為 0, 0)處用 color 顏色執(zhí)行區(qū)域填充(即與 x, y 點(diǎn)顏色相同且相鄰的點(diǎn)都會(huì)被填充)滞诺。
-
imagesetpixel
-- 畫一個(gè)單一像素
語法:bool imagesetpixel ( resource image, int x, int y, int color )
imagesetpixel() 在 image 圖像中用 color 顏色在 x形导,y 坐標(biāo)(圖像左上角為 0,0)上畫一個(gè)點(diǎn)习霹。
-
imageline
-- 畫一條線段
語法:bool imageline ( resource image, int x1, int y1, int x2, int y2, int color )
imageline() 用 color 顏色在圖像 image 中從坐標(biāo) x1朵耕,y1 到 x2,y2(圖像左上角為 0, 0)畫一條線段淋叶。
-
imagerectangle
-- 畫一個(gè)矩形
語法:bool imagerectangle ( resource image, int x1, int y1, int x2, int y2, int col )
imagerectangle() 用 col 顏色在 image 圖像中畫一個(gè)矩形阎曹,其左上角坐標(biāo)為 x1, y1,右下角坐標(biāo)為 x2, y2。圖像的左上角坐標(biāo)為 0, 0处嫌。
-
imagefilledrectangle
-- 畫一矩形并填充
語法:bool imagefilledrectangle ( resource image, int x1, int y1, int x2, int y2, int color )
imagefilledrectangle() 在 image 圖像中畫一個(gè)用 color 顏色填充了的矩形栅贴,其左上角坐標(biāo)為 x1,y1熏迹,右下角坐標(biāo)為 x2檐薯,y2。0, 0 是圖像的最左上角注暗。
-
imageellipse
-- 畫一個(gè)橢圓
語法:bool imageellipse ( resource image, int cx, int cy, int w, int h, int color )
imageellipse() 在 image 所代表的圖像中畫一個(gè)中心為 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)為中心畫一個(gè)橢圓骗卜。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 所代表的圖像中畫一個(gè)橢圓弧焚刺。w 和 h 分別指定了橢圓的寬度和高度敛摘,起始和結(jié)束點(diǎn)以 s 和 e 參數(shù)以角度指定。0°位于三點(diǎn)鐘位置乳愉,以順時(shí)針方向繪畫兄淫。
-
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 參數(shù)以角度指定了起始和結(jié)束點(diǎn)泄私。style 可以是下列值按位或(OR)后的值:
IMG_ARC_PIE IMG_ARC_CHORD
IMG_ARC_NOFILL IMG_ARC_EDGED
IMG_ARC_PIE 和 IMG_ARC_CHORD 是互斥的;IMG_ARC_CHORD 只是用直線連接了起始和結(jié)束點(diǎn)备闲,IMG_ARC_PIE 則產(chǎn)生圓形邊界晌端。IMG_ARC_NOFILL 指明弧或弦只有輪廓,不填充恬砂。IMG_ARC_EDGED 指明用直線將起始和結(jié)束點(diǎn)與中心點(diǎn)相連咧纠,和 IMG_ARC_NOFILL 一起使用是畫餅狀圖輪廓的好方法(而不用填充)。
在圖像中繪制文字
-
imagestring
-- 水平地畫一行字符串
語法:bool imagestring ( resource image, int font, int x, int y, string s, int col )
imagestring() 用 col 顏色將字符串 s 畫到 image 所代表的圖像的 x泻骤,y 坐標(biāo)處(這是字符串左上角坐標(biāo)漆羔,整幅圖像的左上角為 0梧奢,0)。如果 font 是 1演痒,2亲轨,3,4 或 5,則使用內(nèi)置字體。
-
imagestringup
-- 垂直地畫一行字符串
語法:bool imagestringup ( resource image, int font, int x, int y, string s, int col )
-
imagechar
-- 水平地畫一個(gè)字符
語法:bool imagechar ( resource image, int font, int x, int y, string c, int color )
imagechar() 將字符串 c 的第一個(gè)字符畫在 image 指定的圖像中琢蛤,其左上角位于 x蜒犯,y(圖像左上角為 0, 0),顏色為 color。如果 font 是 1,2,3晕粪,4 或 5,則使用內(nèi)置的字體(更大的數(shù)字對(duì)應(yīng)于更大的字體)渐裸。
-
imagecharup
-- 垂直地畫一個(gè)字符
語法: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,則使用內(nèi)置的字體载迄。
-
imagettftext
-- 用 TrueType 字體向圖像寫入文本
語法 :array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )
-
imagestring()
用 col 顏色將字符串 s 垂直地畫到 image 所代表的圖像的 x, y 座標(biāo)處(圖像的左上角為 0, 0)讯柔。如果 font 是 1,2护昧,3魂迄,4 或 5,則使用內(nèi)置字體惋耙。
驗(yàn)證碼的繪制和使用
驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫捣炬,是一種區(qū)分用戶是計(jì)算機(jī)和人的公共全自動(dòng)程序。
使用驗(yàn)證碼的目的:可以防止:惡意破解密碼绽榛、刷票遥金、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試蒜田。
驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式(比如招商銀行的網(wǎng)上個(gè)人銀行,百度社區(qū))选泻。
驗(yàn)證碼的樣式也是千奇百態(tài)冲粤,本節(jié)重點(diǎn)講解使用GD庫繪制圖像的方式美莫。
設(shè)計(jì)驗(yàn)證碼的步驟
gd庫支持
生成底圖
產(chǎn)生一塊圖片
創(chuàng)建畫布
$img=imagecreatetruecolor('x','y')
準(zhǔn)備顏色
$bgcolor=imagecolorallocate($img,255,255,255)
填充顏色
imagefill($image,'x','y',$bgcolor)在圖片中生成干擾元素
在底圖上顯示隨機(jī)數(shù)字
準(zhǔn)備字體顏色
可隨機(jī)
$fontcolor=imagecolorallocate($img,0,0,0);
準(zhǔn)備字體大小
$fontsize=10
準(zhǔn)備字體內(nèi)容
$content = rand(0,9)
將內(nèi)容填充到畫布上
imagestring($img,$fontsize,$x,$y,$content,$fontcolor)
注意:控制好字體大小與分布,避免字體重疊或顯示不全
為驗(yàn)證碼增加干擾元素梯捕,干擾的點(diǎn)或線
準(zhǔn)備點(diǎn)的顏色
可隨機(jī)
$pointcolor=imagecolorallocate($img,175,175,175)
畫點(diǎn)
imagesetpixel($img,$x,$y,$pointcolor)
增加線干擾元素
準(zhǔn)備顏色
可隨機(jī)
$linecolor=imagecolorallocate($img,90,90,90)
畫線
imageline($img,x,y,x,y,$linecolor)
注意:干擾元素一定要控制好顏色厢呵,避免喧賓奪主生成驗(yàn)證內(nèi)容
生成無規(guī)律內(nèi)容
數(shù)字、字母傀顾、數(shù)字加字母
服務(wù)器保存改內(nèi)容生成驗(yàn)證碼圖片
輸出
header('content-type:image/png')
imagepng($rimg)
銷毀資源
imagedestroy($img)校驗(yàn)驗(yàn)證內(nèi)容
在服務(wù)器記錄驗(yàn)證碼信息襟铭,便于用戶輸入后做校驗(yàn)
session_start()
必須處于腳本最頂部
多服務(wù)器情況,需要考慮集中管理session信息
用戶輸入對(duì)比服務(wù)器保存內(nèi)容
PHP圖片處理(縮放短曾、裁剪寒砖、水印、旋轉(zhuǎn)和翻轉(zhuǎn))
圖片背景管理
從指定的圖片文件或 URL地址來新建一個(gè)圖像嫉拐。成功則返回一個(gè)圖像標(biāo)識(shí)符哩都,失敗時(shí)返回一個(gè)空字符串,并且輸出一條錯(cuò)誤信息婉徘。
由于格式不同漠嵌,則需要分別使用對(duì)應(yīng)圖片背景處理函數(shù)。
- 從 PNG 文件或 URL 新建一圖像
resource imagecreatefrompng ( string filename )
- 從 JPEG 文件或 URL 新建一圖像
resource imagecreatefromjpeg ( string filename )
- 從 GIF 文件或 URL 新建一圖像
resource imagecreatefromgif ( string filename )
- 從 WBMP 文件或 URL 新建一圖像
resource imagecreatefromwbmp ( string filename )
其他圖像處理函數(shù):
- 取得圖像寬度
int imagesx ( resource image )
- 取得圖像高度
int imagesy ( resource image )
- 取得圖像大小盖呼、類型等信息
array getimagesize ( string $filename [, array &$imageinfo ] )
圖片縮放和裁剪
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 )
重采樣拷貝部分圖像并調(diào)整大小儒鹿,是將一幅圖像中的一塊正方形區(qū)域拷貝到另一個(gè)圖像中,平滑地插入像素值几晤,因此约炎,尤其是,減小了圖像的大小而仍然保持了極大的清晰度锌仅。成功時(shí)返回 TRUE章钾, 或者在失敗時(shí)返回 FALSE。其中dst_image 和 src_image 分別是目標(biāo)圖像和源圖像的標(biāo)識(shí)符热芹。
添加圖片水印
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 圖像中坐標(biāo)從 src_x,src_y 開始伊脓,寬度為 src_w府寒,高度為 src_h 的一部分拷貝到 dst_im 圖像中坐標(biāo)為 dst_x 和 dst_y 的位置上。
圖片旋轉(zhuǎn)和翻轉(zhuǎn)
resource imagerotate ( resource $src_im , float $angle , int $bgd_color [, int $ignore_transparent ] )
用給定角度旋轉(zhuǎn)圖像
將 src_im 圖像用給定的 angle 角度旋轉(zhuǎn)报腔。bgd_color 指定了旋轉(zhuǎn)后沒有覆蓋到的部分的顏色株搔。
旋轉(zhuǎn)的中心是圖像的中心,旋轉(zhuǎn)后的圖像會(huì)按比例縮小以適合目標(biāo)圖像的大小——邊緣不會(huì)被剪去纯蛾。
如果 ignore_transparent 被設(shè)為非零值纤房,則透明色會(huì)被忽略(否則會(huì)被保留)。
Have a try
- 使用GD庫實(shí)現(xiàn)驗(yàn)證碼翻诉?
- 實(shí)現(xiàn)在一張圖片上添加文字水印炮姨。
- 實(shí)現(xiàn)一張圖片的等比縮小一半的處理(如a.jpg圖片會(huì)生成一個(gè)s_a.jpg的小圖)捌刮;