PHP作圖(四)(完)

 到前面爲止,我們已經能夠用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過程中的心得就全部說完了。感謝大家的關注!讓我們共同進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章