9.GD庫圖像處理

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è)步驟:
  1. 創(chuàng)建一個(gè)背景圖像(也叫畫布)负甸,以后的操作都基于此背景圖像流强。

  2. 在背景上繪制圖像輪廓或輸入文本。

  3. 輸出最終圖形

  4. 釋放資源

<?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庫支持

  1. 生成底圖
    產(chǎn)生一塊圖片
    創(chuàng)建畫布
    $img=imagecreatetruecolor('x','y')
    準(zhǔn)備顏色
    $bgcolor=imagecolorallocate($img,255,255,255)
    填充顏色
    imagefill($image,'x','y',$bgcolor)

  2. 在圖片中生成干擾元素
    在底圖上顯示隨機(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)
    注意:干擾元素一定要控制好顏色厢呵,避免喧賓奪主

  3. 生成驗(yàn)證內(nèi)容
    生成無規(guī)律內(nèi)容
    數(shù)字、字母傀顾、數(shù)字加字母
    服務(wù)器保存改內(nèi)容

  4. 生成驗(yàn)證碼圖片
    輸出
    header('content-type:image/png')
    imagepng($rimg)
    銷毀資源
    imagedestroy($img)

  5. 校驗(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

  1. 使用GD庫實(shí)現(xiàn)驗(yàn)證碼翻诉?
  2. 實(shí)現(xiàn)在一張圖片上添加文字水印炮姨。
  3. 實(shí)現(xiàn)一張圖片的等比縮小一半的處理(如a.jpg圖片會(huì)生成一個(gè)s_a.jpg的小圖)捌刮;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舒岸,隨后出現(xiàn)的幾起案子绅作,更是在濱河造成了極大的恐慌,老刑警劉巖蛾派,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俄认,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洪乍,警方通過查閱死者的電腦和手機(jī)眯杏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來典尾,“玉大人役拴,你說我怎么就攤上這事〖毓。” “怎么了河闰?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)褥紫。 經(jīng)常有香客問我姜性,道長(zhǎng),這世上最難降的妖魔是什么髓考? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任部念,我火速辦了婚禮,結(jié)果婚禮上氨菇,老公的妹妹穿的比我還像新娘儡炼。我一直安慰自己,他們只是感情好查蓉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布乌询。 她就那樣靜靜地躺著,像睡著了一般豌研。 火紅的嫁衣襯著肌膚如雪妹田。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天鹃共,我揣著相機(jī)與錄音鬼佣,去河邊找鬼。 笑死霜浴,一個(gè)胖子當(dāng)著我的面吹牛晶衷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼晌纫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼驻龟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缸匪,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎类溢,沒想到半個(gè)月后凌蔬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闯冷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年砂心,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇耀。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辩诞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纺涤,到底是詐尸還是另有隱情译暂,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布撩炊,位于F島的核電站外永,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拧咳。R本人自食惡果不足惜伯顶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骆膝。 院中可真熱鬧祭衩,春花似錦、人聲如沸阅签。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愉择。三九已至劫乱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锥涕,已是汗流浹背衷戈。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留层坠,地道東北人殖妇。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像破花,于是被迫代替她去往敵國和親谦趣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疲吸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容