相關中文參考手冊:http://w.yi.org/ftp/FAPM/PHP/zh/ref.image.html
向來跟映像沾邊的東西比較容易提起我興趣。這個要好好學習一下了。
映像格式
JPEG
音“jay-peg”。有損壓縮,人眼可忍受。不適合繪製線條、文本或顏色塊
PNG
音“ping”。無損壓縮,適合包含文本、直線或簡單顏色塊。提供可變透明度、微細修正和二維空間交錯。不支援動畫。動畫支援在其擴充格式MNG中,不知道開發完成了沒。目前的瀏覽器應該還不支援。
GIF
無損壓縮,適合包含文本、直線或簡單顏色塊。支援動畫。
建立映像的步驟
1.建立一個背景映像,以後的操作都將基於此背景映像。
2.在背景映像上繪製圖形輪廓或輸入文本。
3.輸出最終圖形。
4.清除所有資源。
例:
Code
<?php
$height = 200;
$width = 200;
//建立一個真彩色映像
$im = imagecreatetruecolor($width, $height);
//構造顏色,返回可供使用的顏色標識符
$white = imagecolorallocate($im, 255, 255, 255);
$blue = imagecolorallocate($im, 0, 0, 150);
//在(0, 0)處用藍色進列區域填充
imagefill($im, 0, 0, $blue);
//繪製直線
imageline($im, 0, 0, $width, $height, $white);
//繪製文本
imagestring($im, 4, 50, 150, 'Sales', $white);
//告訴瀏覽器我們要輸出的是映像而不是文本,並且制定MIME類型
header('Content-type:image/png');
//輸出映像資料
imagepng($im);
//銷毀映像標識符所佔用的資源
imagedestroy($im);
?>
這個是最簡單的流程。
ImageFill()函數的疑問
查手冊說是對該點以及連通地區進行填充,但是不清楚是四連通還是八連通。
關於header()函數
header()函數和繪圖沒有直接關係。該函數發送一個HTML標題字串。通常,瀏覽器中接收一個檔案時,Web伺服器首先發送的內容是MIME類型,以告訴瀏覽去應該怎樣解析接下來的資料。
對於一個HTML或者PHP頁面,最先發送的是:Content-type: text/html
我們的這個例子中則是通過 Content-type: image/png 告訴瀏覽器將發生的是一個png映像而不是常規的HTML輸出。比較奇怪的是實際進行測試的時候,發送其他類型或者不發送這個標題,IE7瀏覽器一樣可以顯示映像。但這在FF和Opera中行不通。
header()的一個典型應用是http重新導向:header('Location: http://www.cnblogs.com/zhengchuyu/');
header()只發送一次,也就是說如果同一頁面中已經發送一次了,接下來出現的header()函數將不會被執行。
關於imagepng()函數
實際上這個函數具有兩個參數。第二個如果不設定的話預設發送到瀏覽器顯示。也可以對其進行設定一個檔案名稱,將發送的檔案寫到某處。
使用戶端顯示映像的三種方式
1.如上述方式,一個由映像組成的頁面;
2.將映像寫到檔案中,用img標籤指向它;
3.將映像建立指令碼置於img標籤中,實際上是一種內嵌映像的方式。
如:<img src="simplegraph.php" height="200" width="200" alt="test" />
一些細節中文編碼
在PHP映像中輸出中文,需要使用utf-8編碼,有現成的轉換函式可用:
$utf8_img_text = iconv("gb2312", "utf-8", $text);
保留映像透明
我們可以通過讀入現有映像進行圖象建立,如通過ImageCreateFromPng(),ImageCreateFromJpeg(),ImageCreateFromGif()。當讀入一個具有透明背景的映像時,我們需要保留其透明通道,才可以讓映像保持透明。
imagesavealpha($im, true);
讀入字型檔
需要讀入字型檔的時候,可能會遇到檔案存取權限的問題(無法訪問硬碟上其他目錄)提示Invalid font filename。目前的解決辦法是將字型檔拷貝到指令碼所在目錄,指定檔案目錄
putenv('GDFONTPATH='.realpath('.'));