說說PHP作圖(四)(完)
來源:互聯網
上載者:User
到前面為止,我們已經能夠用GD完成作圖基本的需要了。但有的時候恐怕就要嫌ImageString
能用的五種字型少而且難看,那就要用到下面的函數了。這個函數允許我們使用TTF字型;但你
必須擁有這些字型的檔案。
<?php
Header("Content-type: image/png");
$im = ImageCreate(400,250);
$col_back = ImageColorAllocate($im,136,200,152);
$col_write = ImageColorAllocate($im,255,255,255);
$col_black = ImageColorAllocate($im,0,0,0);
ImageTTFText($im,160,15,40,220,$col_black,"C:/windows/fonts/verdana.ttf","PNG");
// 新的內容只有這一句。參數是這樣的:
// $im 不用說了。 160 這個位置,是字型大小(pt)。15 字串是傾斜角度,水平方向起逆時針。
// 40,220是橫縱座標。注意,跟ImageString不同的是,
// ImageString裡指定的座標是字串的左上方,而ImageTTFText指定的座標是左下角。
// 接下來 $col_black 是顏色嘍,
// "C:/windows/fonts/verdana.ttf"是字型檔路徑,在Linux就是"/.../....."。
// 甚至可以是 "http://...."。但是,我沒有這樣用過,也不推薦這樣用。
// 因為不在自己機器上的東西終究是不可靠的,不可以委以重任。
// 最後就是要輸出的字串了。這是尤其要引起注意的,
// 這裡的字串要用UTF-8編碼!!!
// ASCII碼 0~127的字元,ASCII碼等於UTF-8編碼,所以我們在輸出西文字串的時候不需要轉換。
// 而如果要輸出中文,則需要一系列的轉換。
// www.phpx.com的sadly寫了一個GB2312碼到UTF-8碼轉換的函數。
// 我的另一篇文章專門分析了這個函數的工作原理。
ImagePNG($im);
ImageDestroy($im);
?>
類似於ImageFontWidth()和ImageFontHeight()協助我們計算ImageString輸出字串將要佔用的
高度和寬度,ImageTTFBBox可以協助我們計算ImageTTFText輸出字串的情況。它的傳回值是一個
8成員的數組,分別是(注意這個順序)左下、右下、右上、左上 的橫縱座標。試一下:
<?
$p=ImageTTFBBox(160,0,"C:/windows/fonts/verdana.ttf","PNP");
for($i=0;$i<8;$i+=2)
echo "(".$p[$i].",".$p[$i+1].")"."<br>";
?>
結果是這樣的:
(15,-1)
(306,-1)
(306,-117)
(15,-117)
為什麼出現負數?我也不知道。這些座標是相對於什麼的?無論它是相對於什麼,他們之間的
相對位置是不會改變的。所以,這些都不太重要,我們根據左、右邊的橫座標的差和上、下邊縱座標
的差,就足夠計算出應該把左下點安排在什麼位置了。
好了,講完了利用TTF字型輸出字串,也順便解決了前面“要想寫漢字還得費一些麻煩”的
遺留話柄。以我來看,GD還剩下最後一部分內容——開啟現有圖片、處理、重新輸出。
首先,取得圖片的資訊,是基本的需要。看下面的例子:
<?
$im=ImageCreateFromPNG("test.png");
// 這就是開啟已經存在的圖象。
// 很簡單,參數是圖片路徑,傳回值是圖象ID。
echo "The image's width is ".ImageSX($im).", and height is ".ImageSY($im).".";
// ImageSX()和ImageSY分別是得到圖象的寬和高,他們都只需要一個參數——已經開啟的圖象ID。
?>
另外,還有一個不屬於GD庫的擷取圖象資訊的函數:GetImageSize。
<?
$p=GetImageSize("test.png");
for($i=0;$i<4;$i++) echo $p[$i]."<br>";
?>
結果是這樣的:
50
100
3
width="50" height="100"
可見,該函數返回了一個關於該圖片資訊的數組,四個元素分別為:前兩個是圖象的寬、高;
第三個代表圖象的格式:1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP。最後一個
元素是用在HTML裡的表示該圖象寬、高的字串(真是太方便了!)。比如我們可以這樣用:
<?
....
$pic_name="....";
$pic_size=GetImageSize($pic_name);
?>
<img src="<?echo $pic_name;?>" <?echo $pic_size[3];?>>
.....
再重複一遍,這個函數不屬於GD庫,所以,在沒有裝GD庫的PHP環境中也可以使用!!
縮圖是經常需要的功能。使用GD的“拷貝並調整大小”的函數可以很容易實現縮圖。
<?
// 假設要把任意大小的圖片縮小(放大)到寬200象素。
// Header("Content-type: image/jpeg");
$pic_name="test.jpg";
$ims=ImageCreateFromJPEG($pic_name);
// 開啟原圖。
$owidth=ImageSX($ims);
$oheight=ImageSY($ims);
// 取得原圖的寬、高。
$nheight=Round($oheight*200.0/$owidth);
// 計算新圖的高度。
$imt=ImageCreate(200,$nheight);
// 建立新圖。
ImageCopyResized($imt,$ims,0,0,0,0,200,$nheight,$owidth,$oheight);
// 拷貝到新圖並調整大小。
// 這個函數參數比較多,首先,是目的圖象和原圖象的ID,
// 然後的四個參數是目的圖象和原圖象的拷貝位置的座標。
// 如從原圖象的 20,30 拷到目的圖象的 10,0
// 則這四個參數是 10,0,20,30。
// 再接下來的四個也是最後四個參數是目的圖象和原圖象的拷貝地區的寬高,
// 如從原圖象拷貝 100x50 那麼大的地區到目的圖象並縮小到 50x25
// 則這四個參數是 50,25,100,50。
// 而這裡我使用的參數,是將原圖完整地拷貝到新圖,(拷貝位置均為 0,0)
// 將原始大小無論放大還是縮小,均調整到寬200象素。
// 200,$nheight 是新圖的寬、高,$owidth,$oheight是原圖的寬、高。
// 使用這個函數的時候注意每一組參數裡,
// 都是與目的圖象相關的參數在前,與原圖象相關的參數在後。
ImageJPEG($imt);
ImageDestroy($imt);
ImageDestroy($ims);
?>
好了,說到這裡,我的在做GD過程中的心得就全部說完了。感謝大家的關注!讓我們共同進步!