PHP 圖形圖像操作

GD庫簡介

GD指的是Graphic Device肋拔,PHP的GD庫是用來處理圖形的擴展庫,通過GD庫提供的一系列API,可以對圖像進行處理或者直接生成新的圖片吐根。

PHP除了能進行文本處理以外酥宴,通過GD庫把介,可以對JPG药薯、PNG薄料、GIF获诈、SWF等圖片進行處理仍源。GD庫常用在圖片加水印,驗證碼生成等方面舔涎。

PHP默認已經(jīng)集成了GD庫笼踩,只需要在安裝的時候開啟就行。

<?php
header("content-type: image/png");
$img=imagecreatetruecolor(100, 100);
$red=imagecolorallocate($img, 0xFF, 0x00, 0x00);
imagefill($img, 0, 0, $red);
imagepng($img);
imagedestroy($img);

繪制線條

  1. 要對圖形進行操作亡嫌,首先要新建一個畫布嚎于,通過imagecreatetruecolor函數(shù)可以創(chuàng)建一個真彩色的空白圖片:
    $img = imagecreatetruecolor(100, 100);

  2. GD庫中對于畫筆所用的顏色,需要通過imagecolorallocate函數(shù)進行分配挟冠,通過參數(shù)設(shè)定RGB的顏色值來確定畫筆的顏色:
    $red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

  3. 然后我們通過調(diào)用繪制線段函數(shù)imageline進行線條的繪制于购,通過指定起點跟終點來最終得到線條。
    imageline($img, 0, 0, 100, 100, $red);

  4. 線條繪制好以后知染,通過header與imagepng進行圖像的輸出肋僧。
    header("content-type: image/png"); imagepng($img);

  5. 最后可以調(diào)用imagedestroy釋放該圖片占用的內(nèi)存。
    imagedestroy($img);

通過上面的步驟,可以發(fā)現(xiàn)PHP繪制圖形非常的簡單嫌吠,但很多時候我們不只是需要輸出圖片止潘,可能我們還需要得到一個圖片文件,可以通過imagepng函數(shù)指定文件名將繪制后的圖像保存到文件中辫诅。
imagepng($img, 'img.png');

<?php
$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
//在這里使用imageline繪制線條
imageline($img, 20, 20, 100, 100, $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);

在圖像中繪制文字

GD庫可以進行多種圖形的基本操作凭戴,常用的有繪制線條,背景填充炕矮,畫矩形么夫,繪制文字等。

跟繪制線條類似肤视,首先需要新建一個圖片與初始化顏色档痪。

$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

然后使用imagestring函數(shù)來進行文字的繪制,這個函數(shù)的參數(shù)很多:imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col )钢颂,可以通過$font來設(shè)置字體的大小钞它,x,y設(shè)置文字顯示的位置拜银,$s是要繪制的文字,$col是文字的顏色殊鞭。

imagestring($img, 5, 0, 0, "Hello world", $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);

使用imagestring繪制文字,在圖像中輸出hello world尼桶。

<?php
$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
//在這里繪制文字

header("content-type: image/png");
imagepng($img);
imagedestroy($img);

輸出圖像文件

通過imagepng可以直接輸出圖像到瀏覽器操灿,但是很多時候,我們希望將處理好的圖像保存到文件泵督,以便可以多次使用趾盐。通過指定路徑參數(shù)將圖像保存到文件中。

$filename = 'img.png';
imagepng($img, $filename);

使用imagepng可以將圖像保存成png格式小腊,如果要保存成其他格式需要使用不同的函數(shù)救鲤,使用imagejpeg將圖片保存成jpeg格式,imagegif將圖片保存成gif格式秩冈,需要說明的是本缠,imagejpeg會對圖片進行壓縮,因此還可以設(shè)置一個質(zhì)量參數(shù)入问。

$filename = 'img.jpg';
?imagejpeg($img, $filename, 80);

生成圖像驗證碼

簡單的驗證碼其實就是在圖片中輸出了幾個字符丹锹,通過我們前面章節(jié)講到的imagestring函數(shù)就能實現(xiàn)。

但是在處理上芬失,為了使驗證碼更加的安全楣黍,防止其他程序自動識別,因此常常需要對驗證碼進行一些干擾處理棱烂,通常會采用繪制一些噪點租漂,干擾線段,對輸出的字符進行傾斜、扭曲等操作窜锯。

可以使用imagesetpixel繪制點來實現(xiàn)噪點干擾张肾,但是只繪制一個點的作用不大,因此這里常常會使用循環(huán)進行隨機繪制锚扎。

for($i=0;$i<50;$i++) {
  imagesetpixel($im, rand(0, 100) , rand(0, 100) , $black); 
  imagesetpixel($im, rand(0, 100) , rand(0, 100) , $green);
} 
  • 驗證碼的實現(xiàn)原理:
<?php
$img = imagecreatetruecolor(100, 40);
$black = imagecolorallocate($img, 0x00, 0x00, 0x00);
$green = imagecolorallocate($img, 0x00, 0xFF, 0x00);
$white = imagecolorallocate($img, 0xFF, 0xFF, 0xFF);
imagefill($img,0,0,$white);
//生成隨機的驗證碼
$code = '';
for($i = 0; $i < 4; $i++) {
    $code .= rand(0, 9);
}
imagestring($img, 5, 10, 10, $code, $black);
//加入噪點干擾
for($i=0;$i<50;$i++) {
  imagesetpixel($img, rand(0, 100) , rand(0, 100) , $black); 
  imagesetpixel($img, rand(0, 100) , rand(0, 100) , $green);
}
//輸出驗證碼
header("content-type: image/png");
imagepng($img);
imagedestroy($img);

給圖片添加水印

給圖片添加水印的方法一般有兩種吞瞪,一種是在圖片上面加上一個字符串,另一種是在圖片上加上一個logo或者其他的圖片驾孔。

因為這里處理的是已經(jīng)存在的圖片芍秆,所以可以直接從已存在的圖片建立畫布,通過imagecreatefromjpeg可以直接從圖片文件創(chuàng)建圖像翠勉。

$im = imagecreatefromjpeg($filename);

創(chuàng)建圖像對象以后妖啥,我們就可以通過前面的GD函數(shù),繪制字符串到圖像上对碌。如果要加的水印是一個logo圖片荆虱,那么就需要再建立一個圖像對象,然后通過GD函數(shù)imagecopy將logo的圖像復制到源圖像中朽们。

$logo = imagecreatefrompng($filename);
imagecopy($im, $logo, 15, 15, 0, 0, $width, $height);

當將logo圖片復制到原圖片上以后怀读,將加水印后的圖片輸出保存就完成了加水印處理。

imagejpeg($im, $filename);
  • 圖片加水印原理:
<?php
//這里僅僅是為了案例需要準備一些素材圖片
$url='http://www.iyi8.com/uploadfile/2014/0521/20140521105216901.jpg';
$content = file_get_contents($url);
$filename = 'tmp.jpg';
file_put_contents($filename, $content);
$url='http://wiki.ubuntu.org.cn/images/3/3b/Qref_Edubuntu_Logo.png';
file_put_contents('logo.png', file_get_contents($url));
//開始添加水印操作
$im = imagecreatefromjpeg($filename);
$logo = imagecreatefrompng('logo.png');
$size = getimagesize('logo.png');
imagecopy($im, $logo, 15, 15, 0, 0, $size[0], $size[1]); 
header("content-type: image/jpeg");
imagejpeg($im);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骑脱,一起剝皮案震驚了整個濱河市菜枷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叁丧,老刑警劉巖啤誊,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拥娄,居然都是意外死亡蚊锹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門稚瘾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牡昆,“玉大人,你說我怎么就攤上這事孟抗∏ㄑ睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵凄硼,是天一觀的道長铅协。 經(jīng)常有香客問我,道長摊沉,這世上最難降的妖魔是什么狐史? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上骏全,老公的妹妹穿的比我還像新娘苍柏。我一直安慰自己,他們只是感情好姜贡,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布试吁。 她就那樣靜靜地躺著,像睡著了一般楼咳。 火紅的嫁衣襯著肌膚如雪熄捍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天母怜,我揣著相機與錄音余耽,去河邊找鬼。 笑死苹熏,一個胖子當著我的面吹牛碟贾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轨域,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼袱耽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疙挺?” 一聲冷哼從身側(cè)響起扛邑,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怜浅,失蹤者是張志新(化名)和其女友劉穎铐然,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恶座,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡搀暑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跨琳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片自点。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脉让,靈堂內(nèi)的尸體忽然破棺而出桂敛,到底是詐尸還是另有隱情,我是刑警寧澤溅潜,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布术唬,位于F島的核電站,受9級特大地震影響滚澜,放射性物質(zhì)發(fā)生泄漏粗仓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望借浊。 院中可真熱鬧塘淑,春花似錦、人聲如沸蚂斤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曙蒸。三九已至召噩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逸爵,已是汗流浹背具滴。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留师倔,地道東北人构韵。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像趋艘,于是被迫代替她去往敵國和親疲恢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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