說說PHP作圖(4)(完)
發(fā)表時間:2023-08-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]到前面為止,我們已經(jīng)能夠用GD完成作圖基本的需要了。但有的時候恐怕就要嫌ImageString 能用的五種字體少而且難看,那就要用到下面的函數(shù)了。這個函數(shù)允許我們使用TTF字體;但你必須擁有這些字體...
到前面為止,我們已經(jīng)能夠用GD完成作圖基本的需要了。但有的時候恐怕就要嫌ImageString
能用的五種字體少而且難看,那就要用到下面的函數(shù)了。這個函數(shù)允許我們使用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");
// 新的內(nèi)容只有這一句。參數(shù)是這樣的:
// $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編碼,所以我們在輸出西文字符串的時候不需要轉(zhuǎn)換。
// 而如果要輸出中文,則需要一系列的轉(zhuǎn)換。
// www.phpx.com的sadly寫了一個GB2312碼到UTF-8碼轉(zhuǎn)換的函數(shù)。
// 我的另一篇文章專門分析了這個函數(shù)的工作原理。
ImagePNG($im);
ImageDestroy($im);
?>
類似于ImageFontWidth()和ImageFontHeight()幫助我們計算ImageString輸出字串將要占用的
高度和寬度,ImageTTFBBox可以幫助我們計算ImageTTFText輸出字符串的情況。它的返回值是一個
8成員的數(shù)組,分別是(注意這個順序)左下、右下、右上、左上 的橫縱坐標。試一下:
<?
$p=ImageTTFBBox(160,0,"C:/windows/fonts/verdana.ttf","PNP");
for($i=0;$i<8;$i+=2)
echo "(".$p[$i].",".$p[$i+1].")"."<br>";
?>
結(jié)果是這樣的:
(15,-1)
(306,-1)
(306,-117)
(15,-117)
為什么出現(xiàn)負數(shù)?我也不知道。這些坐標是相對于什么的?無論它是相對于什么,他們之間的
相對位置是不會改變的。所以,這些都不太重要,我們根據(jù)左、右邊的橫坐標的差和上、下邊縱坐標
的差,就足夠計算出應該把左下點安排在什么位置了。
好了,講完了利用TTF字體輸出字符串,也順便解決了前面“要想寫漢字還得費一些麻煩”的
遺留話柄。以我來看,GD還剩下最后一部分內(nèi)容——打開現(xiàn)有圖片、處理、重新輸出。
首先,取得圖片的信息,是基本的需要?聪旅娴睦樱
<?
$im=ImageCreateFromPNG("test.png");
// 這就是打開已經(jīng)存在的圖象。
// 很簡單,參數(shù)是圖片路徑,返回值是圖象ID。
echo "The image's width is ".ImageSX($im).", and height is ".ImageSY($im).".";
// ImageSX()和ImageSY分別是得到圖象的寬和高,他們都只需要一個參數(shù)——已經(jīng)打開的圖象ID。
?>
另外,還有一個不屬于GD庫的獲取圖象信息的函數(shù):GetImageSize。
<?
$p=GetImageSize("test.png");
for($i=0;$i<4;$i++) echo $p[$i]."<br>";
?>
結(jié)果是這樣的:
50
100
3
width="50" height="100"
可見,該函數(shù)返回了一個關(guān)于該圖片信息的數(shù)組,四個元素分別為:前兩個是圖象的寬、高;
第三個代表圖象的格式: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];?>>
.....
再重復一遍,這個函數(shù)不屬于GD庫,所以,在沒有裝GD庫的PHP環(huán)境中也可以使用。
縮略圖是經(jīng)常需要的功能。使用GD的“拷貝并調(diào)整大小”的函數(shù)可以很容易實現(xiàn)縮略圖。
<?
// 假設要把任意大小的圖片縮小(放大)到寬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);
// 拷貝到新圖并調(diào)整大小。
// 這個函數(shù)參數(shù)比較多,首先,是目的圖象和原圖象的ID,
// 然后的四個參數(shù)是目的圖象和原圖象的拷貝位置的坐標。
// 如從原圖象的 20,30 拷到目的圖象的 10,0
// 則這四個參數(shù)是 10,0,20,30。
// 再接下來的四個也是最后四個參數(shù)是目的圖象和原圖象的拷貝區(qū)域的寬高,
// 如從原圖象拷貝 100x50 那么大的區(qū)域到目的圖象并縮小到 50x25
// 則這四個參數(shù)是 50,25,100,50。
// 而這里我使用的參數(shù),是將原圖完整地拷貝到新圖,(拷貝位置均為 0,0)
// 將原始大小無論放大還是縮小,均調(diào)整到寬200象素。
// 200,$nheight 是新圖的寬、高,$owidth,$oheight是原圖的寬、高。
// 使用這個函數(shù)的時候注意每一組參數(shù)里,
// 都是與目的圖象相關(guān)的參數(shù)在前,與原圖象相關(guān)的參數(shù)在后。
ImageJPEG($imt);
ImageDestroy($imt);
ImageDestroy($ims);
?>
好了,說到這里,我的在做GD過程中的心得就全部說完了。感謝大家的關(guān)注!讓我們共同進步!