<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      說說PHP作圖(4)(完)

      [摘要]到前面為止,我們已經能夠用GD完成作圖基本的需要了。但有的時候恐怕就要嫌ImageString 能用的五種字體少而且難看,那就要用到下面的函數了。這個函數允許我們使用TTF字體;但你必須擁有這些字體...
      到前面為止,我們已經能夠用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過程中的心得就全部說完了。感謝大家的關注!讓我們共同進步!



      日韩精品一区二区三区高清