一起學習PHP中GD庫的使用(一)

又到了一個大家非常熟悉的庫了,對于圖像圖形的處理來說,GD 庫是 PHPer 們繞不過去的一道坎。從很早很早的 CMS 或者 Discuz 時代,各類開源軟件在安裝的時候就會明確地指出 GD 庫是它們必備的一個擴展。當然,在現(xiàn)在的 PHP 版本中,相信大家也不會在編譯的時候忽略掉這個庫。不管你是為圖片加水印、生成縮略圖還是制作驗證碼圖片,都離不開 GD 庫的身影。

當然,我們還是由淺入深地學習一些 GD 庫中的常用或好玩的函數(shù)。

當前環(huán)境中的 GD 庫信息

首先,我們可以查看下當前 PHP 環(huán)境中的 GD 庫版本及支持的圖片格式信息。

var_dump(gd_info());
// array(13) {
//     ["GD Version"]=>
//     string(26) "bundled (2.1.0 compatible)"
//     ["FreeType Support"]=>
//     bool(true)
//     ["FreeType Linkage"]=>
//     string(13) "with freetype"
//     ["GIF Read Support"]=>
//     bool(true)
//     ["GIF Create Support"]=>
//     bool(true)
//     ["JPEG Support"]=>
//     bool(true)
//     ["PNG Support"]=>
//     bool(true)
//     ["WBMP Support"]=>
//     bool(true)
//     ["XPM Support"]=>
//     bool(false)
//     ["XBM Support"]=>
//     bool(true)
//     ["WebP Support"]=>
//     bool(true)
//     ["BMP Support"]=>
//     bool(true)
//     ["JIS-mapped Japanese Font Support"]=>
//     bool(false)
//   }

gd_info() 函數(shù)可以查看到當前 GD 庫的版本信息,其它字段就是各種圖片模式的支持情況,可以看到在我的系統(tǒng)環(huán)境中,除了 XPM 這種格式不支持外,其它各種圖片格式都是正常支持的。最后一個是日文字體的支持,我們當前環(huán)境中也是沒有的。

獲取圖片基本信息

getimagesize(),獲取圖片信息的這個函數(shù),從名字上看是獲取圖片大小的一個函數(shù)但也包含一些其它的信息,而且這個函數(shù)其實和 GD 庫沒什么太大的關系,也就是說不需要 GD 庫的擴展其實這個函數(shù)也是可以使用的。

var_dump(getimagesize("../img/1.png"));
// array(6) {
//     [0]=>
//     int(150)
//     [1]=>
//     int(150)
//     [2]=>
//     int(3)
//     [3]=>
//     string(24) "width="150" height="150""
//     ["bits"]=>
//     int(8)
//     ["mime"]=>
//     string(9) "image/png"
//   }

返回的結果其實非常簡單,0 和 1 分別就是圖片的寬高,2 是圖片的類型,之前的文章就講過它對應的就是 IMAGETYPE_ 常量中對應的圖片類型。3 是文字形式的圖片寬高,可以直接用于 img 標簽中,可以看出來,PHP 真的就是為了 web 而生的語言啊,連圖片大小獲取的函數(shù)都要帶個這樣的屬性回來。bits 就是圖片的 顏色比特位數(shù) 。mime 則是圖片的 MIME 類型了。

另外,getimagesize() 函數(shù)還有第二個參數(shù),這是一個引用類型的參數(shù),它將以一個關聯(lián)數(shù)組返回不同的 JPG APP 標識。也就是說,它也是針對 JPG 相關的圖片獲取一些額外的信息,其實就有點像上篇文章學習過的 EXIF 里面的信息。

var_dump(getimagesize("../img/2.jpg", $info));
// array(7) {
//     [0]=>
//     int(300)
//     [1]=>
//     int(244)
//     [2]=>
//     int(2)
//     [3]=>
//     string(24) "width="300" height="244""
//     ["bits"]=>
//     int(8)
//     ["channels"]=>
//     int(3)
//     ["mime"]=>
//     string(10) "image/jpeg"
//   }

var_dump($info);
// array(1) {
//     ["APP0"]=>
//     string(14) "JFIF??"
//   }

此外,我們如果是 JPG 圖片的話,還會多返回一個 channels 屬性,表示的是如果圖片是 RBG 格式的,返回的就是 3 ,如果是 CMYK 格式的,返回的就是 4 。

我們還可以使用 getimagesize() 獲得遠程文件的信息。

var_dump(getimagesize("https://upload-images.jianshu.io/upload_images/1074666-8df66a94d61cac74.png?imageMogr2/auto-orient/strip|imageView2/2/w/374/format/webp"));
// array(6) {
//     [0]=>
//     int(374)
//     [1]=>
//     int(617)
//     [2]=>
//     int(18)
//     [3]=>
//     string(24) "width="374" height="617""
//     ["bits"]=>
//     int(8)
//     ["mime"]=>
//     string(10) "image/webp"
//   }

除了直接操作圖片文件之外,我們還可以直接從字符串中獲得圖片的信息。不過這些字符串一般也都是讀取到的圖片文件的二進制信息。你直接來一句真正的 Hello World 之類的字符串那打死它也解析不出來什么圖片內容的。

$data = file_get_contents('../img/1.png');
var_dump(getimagesizefromstring($data));
// array(6) {
//     [0]=>
//     int(150)
//     [1]=>
//     int(150)
//     [2]=>
//     int(3)
//     [3]=>
//     string(24) "width="150" height="150""
//     ["bits"]=>
//     int(8)
//     ["mime"]=>
//     string(9) "image/png"
//   }

獲得圖片的一些信息

我們可以通過圖片的類型來獲取文件的擴展名,這個類型常量也是 IMAGETYPE_ 類型的。

var_dump(image_type_to_extension(IMAGETYPE_PNG)); // string(4) ".png"
var_dump(image_type_to_extension(IMAGETYPE_JPEG, FALSE)); // string(4) "jpeg"

image_type_to_extension() 函數(shù)有第二個參數(shù),如果設置為 false 的話,就不會加上那個 . 。

var_dump(image_type_to_mime_type(IMAGETYPE_PNG)); // string(9) "image/png"
var_dump(image_type_to_mime_type(IMAGETYPE_JPEG)); // string(10) "image/jpeg"

同樣地,也有 image_type_to_mime_type() 這個函數(shù)來獲得圖片的 MIME 信息內容。另外,還有一個函數(shù)可以獲得當前系統(tǒng)中所支持的圖片類型都有哪些。

var_dump(imagetypes()); // int(111)

額,很奇怪吧,怎么只返回了一個 111 ?其實它是保存的二進制圖片支持信息,比如如果我們想知道當前系統(tǒng)中有沒有 PNG 圖片的支持,就可以這樣使用:

var_dump(imagetypes() & IMAGETYPE_PNG); // int(3)

和 IMAGETYPE_PNG 與之后的結果就是 IMAGETYPE_PNG 本身的值,這就說明當前系統(tǒng)中是支持這個圖片類型的操作的。

小例子:創(chuàng)建一張自己的圖片

最后,我們再來看一個小例子,其實就是利用 GD 庫中的這些函數(shù)來創(chuàng)建一張簡單的小圖片。

$im = @imagecreate(100, 50) or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  "Test 測試", $text_color);
imagepng($im, '../img/test.png');
imagedestroy($im);

其實每個函數(shù)的內容都很好理解,函數(shù)名就已經(jīng)寫得很清楚了。當然,我們后面的文章中將詳細地再學習一次。這個最終生成的圖片中,中文也是亂碼的,不過它已經(jīng)是可以當做一個圖片驗證碼來使用了,是不是非常地簡單?

總結

今天的內容不多,也都是比較基礎淺顯的一些函數(shù)的使用。當然,這只是開頭的第一篇文章,GD 庫不是一個簡單的小擴展,它里面的內容非常多,能夠實現(xiàn)的功能也非常復雜,不要走開,持續(xù)關注哦!

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/1.一起學習PHP中GD庫的使用(一).php

參考文檔:

https://www.php.net/manual/zh/book.image.php

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容