說說PHP作圖(一)_PHP教程

來源:互聯網
上載者:User

實在不敢說是在這裡“講”GD庫,因為我用GD也才一兩次而已,絕大多數的函數還沒
有接觸到。可是三斑竹小刁熱情地向我約稿,我只好硬著頭皮寫一點自己的心得。希望能
夠起到拋磚引玉的效果。

其實,我們在web頁面裡實現“圖”的效果不一定非用GD不可,比較容易解決的是柱狀
圖——用HTML就可以解決。比如:













/* (1) */





/* (2) */ /* (3) */

/* (4) */


是一組資料,資料從哪裡來,是無
關大局的,就看你的需要了;代碼中需要說兩句的地方我都加了注釋,現在一一來說明。

(1) 這裡要注意的是 valign="bottom",是為了讓儲存格的內容底部對齊。為什麼加在裡
呢?可以讓表格裡這一行的內容都遵循這一對齊,不必在每一個裡指定,這樣可
以使PHP執行結果的HTML頁的原代碼節約好幾十個位元組呐!節約瀏覽者的寶貴時間。

(2) 注意,最關鍵的東西在這裡!

















,我們就是利用table的height屬性來 實現不同高度的“柱”的。我這裡為了讓大家看得清楚,未經處理資料沒有經過按比例的縮放, 如果你的資料特別大,或者特別小,都不適宜直接賦給table的height屬性,而應該根據情 況按適當比例縮放這些資料。比如你估計你的這組資料的每一個數字都會在3000~8000之間, 可以考慮將他們縮小25倍,即 height="" (3) 提一下這一行裡的 bgcolor="#xxxxxx",這是柱體的顏色(RGB)。其實,真正的柱狀圖應該 每一個柱體用一種顏色,這裡為了代碼盡量簡單,我用了這個for迴圈,因此也就沒辦法給 每一個柱體指定一種顏色。——其實也是有辦法的,我只是實在沒有必要為了這個例子再寫 一個抽取顏色的函數來把初學者搞暈。所以,那一部分由你自己去完善吧。 (4) 在這裡以與柱體相同的顏色顯示真實的資料。當然,你也可以選擇把這個數字放在柱體的頂 上,可能更專業一些。然而我本人還是習慣於把它放在下面。 藉助於HTML的table,我們可以構造出各種柱狀圖,這個例子講的是用bgcolor來顯示色塊,除此以外,還可以用 background="(圖片)" ,圖片是帶花紋的,於是柱狀圖的柱體就有了花紋。而你把真實的資料用反差很大的顏色顯示在上面注釋(3)所示的那個
裡,也是很好的效果。

前面是迴避GD的一個有效方法,但要做複雜的圖形,就非用GD不可了。

sadly 的PHP4中文手冊裡,說GD函數庫裡有44個函數,但我看最新版的英文PHP4手冊裡,
GD的函數已經有80餘個!由於筆者英文比較差,讀英文的手冊只能連蒙帶猜,所以不能確定
新的GD庫是否重新支援GIF了?不管怎樣,我認為,既然我們在使用完全免費的PHP,何必要
“冒險”去用有著作權的GIF?何不免費到底,用PNG呢?只要你不需用動畫,PNG同樣可以做出
象GIF一樣小的檔案!

下面我就結合一段程式,一句代碼一句代碼地說說常用的這些GD函數。

從開頭說起吧。

Header("Content-type: image/png");
// 這是發送一個HTTP頭,告訴瀏覽器:“你聽著,這是一個圖象,可別當成文字來顯示呀!”
// 由於我個人的喜好,用了PNG,當然你也可以用 Header("Content-type: image/gif");
// 或者 Header("Content-type: image/jpeg");
$im = ImageCreate (50, 100);
// 建立圖象。注意,圖象在建立的時候還沒有被指定圖象格式。
// ImageCreate函數,兩個參數,無庸質疑,這是建立的圖象的寬度和高度。
// 它的傳回值是一個int數值,這個數值相當重要,你繼續繪製這個圖象、
// 直到你輸出這個圖象之前,無處不用到這個數值,我們暫且稱之為圖象的ID。
// 因為使用的頻率相當高,所以,我們把它賦給一個名字比較短的變數。

// 現在我們先畫一條線吧。畫線的函數是這樣的:
// imageline (int im, int x1, int y1, int x2, int y2, int col);
// 第一個參數im,就是圖象的ID,後面的 x1,y1,x2,y2,不用說了,
// 是起點(x1,y1) 終點(x2,y2)的座標呀!(圖象的左上方座標是 (0,0) )
// 最後一個參數是什麼呀?是顏色!GD要求針對圖象定義顏色,用定義的這些顏色來作圖。
// 為什麼要針對圖象定義顏色?我猜測,是為了GIF、PNG等圖象用之做“調色盤”的。
// 這牽扯到圖象本身的知識,這裡不贅述了。
// 所以,畫線之前,我們還要先定義顏色(真麻煩)。

// $col_red = ImageColorAllocate($im, 255,192,192);
// 這個函數四個參數,第一個$im……還用得著我每次都說嘛?下次就不說啦!
// 後面三個參數就是要定義的顏色的紅(R)、綠(G)、藍(B)的分量,0~255之間。
// 這又牽扯到物理—光學的知識了。紅、綠、藍三原色光分量的不同,
// 產生了千變萬化的色彩。上面我定義的這個顏色,紅255,綠192,藍192。
// 如果沒有搞錯,這是一個較亮的紅色。等一會兒我們來畫一條線試試看。
// 為什麼要等一會兒呢?因為一幅圖只有一種顏色的話,是什麼也看不出來的!
// 我們把背景搞成黑的先!
// 雖然手冊上沒有明確表示,但是我發現最先定義的顏色將預設被作為背景。

$col_black = ImageColorAllocate($im, 0,0,0);
// 定義了一種顏色,紅光、綠光、藍光都沒有,自然黑咕隆咚——黑色。
// 然後再定義畫線用的顏色:
$col_red = ImageColorAllocate($im, 255,192,192);

// 現在可以開始畫紅線了:
imageline ($im, 10, 20, 45, 85, $col_red);
// 別急,這句完了以後你還看不到圖象。

ImagePNG($im);
// 這一句就輸出圖象了,ImagePNG()輸出png圖象,ImageJPEG輸出jpeg圖象,
// ImageGIF輸出gif圖象……
// 不要忘記這裡有一個參數,如果在螢幕顯示,而不是儲存為檔案,
// 則省略這個參數——儲存的檔案名稱。如果這裡是要把它儲存為檔案,
// 就應該這樣寫:ImagePNG($im,"test.png");
// 如果不指定路徑,這個檔案儲存在你的web目前的目錄裡。
// 如果是JPEG,則再多一個參數,是JPEG品質(0~100)。
// 如果要在螢幕顯示,則 ImageJPEG($im,"",80);
// 如果要儲存,則 ImageJPEG($im,"test.jpg",80);
// 注意,如果你要把這個圖象儲存為檔案,
// 就不能使用 Header("Content-type: image/png"); 傳送意味著圖象的HTTP頭,
// 因為一旦這樣,就表示你將輸出圖象。

ImageDestroy($im);
// 毀掉記憶體裡的圖象,以釋放記憶體空間。
// 這樣就好了:一幅最簡單的GD作的圖作成了。

// 通過測試發現,產生這幅圖象檔案,用PNG格式只有131位元組,
// 而用JPEG格式,即便是用最差的品質(0),也需要855位元組,圖象品質糟糕得沒法看。
// 而最高的JPEG品質,則需要2360位元組,色彩卻仍不如用PNG時的鮮豔。
// 由此可見,對於這種顏色數目少的圖象,用PNG比JPEG划算得多。
?>

這一次先說到這裡,我會爭取儘快繼續寫下去。

http://www.bkjia.com/PHPjc/508283.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/508283.htmlTechArticle實在不敢說是在這裡“講”GD庫,因為我用GD也才一兩次而已,絕大多數的函數還沒 有接觸到。可是三斑竹小刁熱情地向我約稿,我只好硬...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.