明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PHP中完成大圖自動(dòng)縮成小圖(及GD庫(kù)的安裝)

[摘要]PHP中實(shí)現(xiàn)大圖自動(dòng)縮成小圖(及GD庫(kù)的安裝)UB 2001.10.11我覺(jué)得網(wǎng)絡(luò)編程與普通編程最大的區(qū)別就是,網(wǎng)絡(luò)編程除了具備普通編程的特性外,還要花很大精力考慮速度的問(wèn)題。網(wǎng)站上需要很多圖片,現(xiàn)在有很多給用戶(hù)存放照片,圖片的“像冊(cè)”程序,可以讓用戶(hù)自己上傳圖片,然后自動(dòng)縮成小圖,可以讓你在一個(gè)...
PHP中實(shí)現(xiàn)大圖自動(dòng)縮成小圖(及GD庫(kù)的安裝)
UB 2001.10.11

我覺(jué)得網(wǎng)絡(luò)編程與普通編程最大的區(qū)別就是,網(wǎng)絡(luò)編程除了具備普通編程的特性外,還要花很大精力考慮速度的問(wèn)題。
網(wǎng)站上需要很多圖片,現(xiàn)在有很多給用戶(hù)存放照片,圖片的“像冊(cè)”程序,可以讓用戶(hù)自己上傳圖片,然后自動(dòng)縮成小圖,可以讓你在一個(gè)頁(yè)面看到很多小圖,然后點(diǎn)擊小圖看大圖。
注意:在網(wǎng)頁(yè)中指定長(zhǎng)寬顯示圖片,只能讓圖片以小尺寸顯示,但是大小(容量)不變(可以看看屬性),速度自然很慢。真正的縮圖是把大圖的大。ㄈ萘浚┳冃。褪侵匦律梢粋(gè)小尺寸的圖片文件。我的一個(gè)程序有此功能,正在測(cè)試:www1.yn.cninfo.net/love
另外,裝上GD庫(kù),還有很多功能,可以用程序畫(huà)圖,做些特別的計(jì)數(shù)器之類(lèi),還可以支持FREETYPE字體等等,里面函數(shù)很多,功能很強(qiáng)大。
先簡(jiǎn)單說(shuō)說(shuō)GIF,JPG,PNG,BMP圖的區(qū)別:他們都是圖形壓縮格式。GIF格式單圖最多能顯示256種顏色,可以保存多圖,適合做小動(dòng)畫(huà),容量較大。 JPEG格式,支持24位(16 百萬(wàn))種顏色,適合于靜態(tài)圖,容量較小。PNG格式,包含GIF,JPEG的所有特點(diǎn),支持48位顏色,但是容量較大,而且應(yīng)用不廣泛。 BMP格式,顏色少,非常老的壓縮格式,對(duì)于網(wǎng)絡(luò)來(lái)說(shuō)太大了。
在PHP中實(shí)現(xiàn)大圖自動(dòng)縮成小圖其實(shí)很簡(jiǎn)單,裝上GD庫(kù),用一個(gè)小函數(shù)就可以了,但是安裝GD庫(kù)很麻煩。在1.6.2 版以前的 GD library 有支持 GIF 格式的功能,但因?yàn)?GIF 格式使用的 LZW 演算法牽涉到 Unisys 的專(zhuān)利權(quán),因此在 GD library 1.6.2 版之后不支持 GIF 的格式。
PHP 在 3.0.13 版之后,終于支持了 PNG 的圖型格式,使用 PNG 就不怕會(huì)有版權(quán)的問(wèn)題了,而且在 PHP 這個(gè)版本以后,安裝編譯時(shí)會(huì)檢查 GD library 支持的是舊的 GIF 格式還是新的 PNG 格式來(lái)決定是否使用 GIF 或 PNG 的專(zhuān)用函數(shù)。

一,安裝GD庫(kù):
1。環(huán)境:windows2000server+PHP4.0.4+GD+IIS
在WINDOWS中安裝很容易,PHP4.0以上版本中自帶,裝好后在php4/extensions 目錄中自帶動(dòng)態(tài)鏈接庫(kù):php_gd.dll 。只要在php.ini 中把 ;extension=php_gd.dll 前面的;去掉,然后重起WEBSERVER(IIS或APACHE),就行了。運(yùn)行一個(gè)帶有<? phpinfo();?>的PHP程序,里面有以下內(nèi)容就說(shuō)明可以用了:
gd
GD Support enabled
GD Version 1.6.2 or higher
FreeType Support enabled
FreeType Linkage with TTF library
JPG Support enabled
PNG Support enabled
WBMP Support enabled

另外,網(wǎng)上有個(gè)php_gd_gif.dll 可以下載,把它改名為php_gd.dll覆蓋掉原文件,重起IIS,就可以實(shí)現(xiàn)帶GIF庫(kù)的GD庫(kù)。
到 http://php.weblogs.com/php_gd 下載 php_gd_404.zip,解壓完成上面操作。
這是for PHP4.0.4的,其他版本的PHP不能用,(老板本的PHP4.0.0可以去下載php_gd_gif.zip)。
呵呵,搞定后你的phpinfo()就會(huì)多顯示一個(gè)GIF Support enabled ,但是涉及到版權(quán)問(wèn)題,自己看著辦吧。


在LINUX裝GD庫(kù)就比較麻煩了,先簡(jiǎn)單說(shuō)說(shuō)關(guān)于APACHE和PHP的安裝:當(dāng)我們?cè)贏pache環(huán)境下安裝PHP的時(shí)候,你有三種安裝模式可供選擇:靜態(tài)模塊、動(dòng)態(tài)模塊(DSO)和CGI。
常用的是靜態(tài)模塊,就是APACHE和PHP在一起編譯,這樣PHP的執(zhí)行效率高一些,但是PHP要升級(jí)或要裝GD庫(kù)之類(lèi)的附加庫(kù)時(shí)就要把兩個(gè)都重新編譯,很麻煩。動(dòng)態(tài)模塊就好辦多了,單獨(dú)重新
編譯PHP就行了,具體安裝查看PHP中的INSTALL文件。我費(fèi)了半天勁安裝成功了,介紹一點(diǎn)靜態(tài)模塊加GD庫(kù)+JPEG+PNG的心得:
2. 環(huán)境: LINUX6.1+PHP4.0.6+GD1.8.4+jpeg+png+zlib+APACHE_1.3.20+MYSQL
1)下載所需的庫(kù):
下載GD庫(kù):建議使用Version 1.8.4 (Stable)穩(wěn)定版,我編譯gd-2.0.1(BETA)時(shí),沒(méi)通過(guò)。
http://www.boutell.com/gd/

下載zlib:
http://www.info-zip.org/pub/infozip/zlib/

下載libpng:建議使用libpng-1.0.6-1-src.tar.gz
http://www.turbolinux.com.cn/pub/mirrors/sourceware/cygwin/contrib/libpng/

下載jpegsrc.v6b.tar.gz:
http://www.turbolinux.com.cn/pub/mirrors/gnu/ghostscript/

以下步驟需要按順序執(zhí)行:
2)我用的是LINUX6.1,內(nèi)核是2.2.12。以ROOT進(jìn)入,解壓所有包,tar -zxvf filename 。然后編譯:
3)如果你的LINUX沒(méi)有安裝zlib,必須先安裝zilb,進(jìn)入zlib-1.1.3 執(zhí)行:
./configure
make
make install
4)進(jìn)入libpng-1.0.6,可以在LINUX,或DOS下安裝,LINUX下需要拷貝他的makefile文件, 執(zhí)行:
cp scripts/makefile.linux makefile
make
make install
5)進(jìn)入jpeg-6b 執(zhí)行:
./configure
make
make install
6a)進(jìn)入gd-1.8.4
修改Makefile
檢查GD庫(kù)編譯時(shí)是否加入加入JPEG支持,得修改Makefile文件。
修改Makefile文件,使得:
CFLAGS=-O -DHAVE_LIBPNG -DHAVE_LIBJPEG
LIBS=-lgd -lpng -lz -lm -ljpeg

或者,如果你FREETYPE,XPM,TTF等庫(kù)都安裝了,(安裝方法大同小異,自己去找?guī)彀桑,就改下面?br>#CFLAGS=-O -DHAVE_LIBXPM -DHAVE_LIBPNG -DHAVE_LIBJPEG
#-DHAVE_LIBFREETYPE -DHAVE_LIBTTF

#LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lm -lttf
去掉#

此后,編譯并安裝:
make
make install

(如果需要MYSQL,而你沒(méi)裝,就先裝MYSQL,解壓,執(zhí)行: ./configure ; make ; make install
./configure --prefix=/home/mysql ,默認(rèn)安裝路徑/usr/local/share/mysql 。)

7)重新編譯PHP,我用的是PHP-4.0.6,最好先看看安裝文件,more INSTALL,然后執(zhí)行:
7.1)解壓進(jìn)入apache_1.3.20,需要先考些文件,執(zhí)行:
./configure --prefix=/home/apache
--activate-module=src/modules/php4/libphp4.a
7.2)解壓進(jìn)入php-4.0.6,編譯安裝:
./configure --with-mysql --with-apache=../apache_1.3.20
--with-gd=../gd-1.8.4 --with-jpeg-dir=../jpeg-6b --with-png-dir=../libpng-1.0.6
--with-zlib --enable-track-var
(默認(rèn)安裝路徑:/usr/local/lib/php)

8)如果你的PHP是和APACHE一起編譯的,靜態(tài)模塊,就要重新編譯APACHE,我用的是apache_1.3.20
先停掉APACHE:./home/apache/bin/apachectl stop
進(jìn)入apache_1.3.20,需要改文件src/Configuration:
加入: AddModule modules/php4/libphp4.a
[ 這是APACHE_1.3.x的安裝,如果你用的是APACHE_1.2.x,就加入Module php4_module mod_php4.o
然后拷貝libphp4.module到src,修改相應(yīng)語(yǔ)句為:EXTRA_LIBS=-L. -lphp4 -lgdbm -ldb -L/usr/local/mysql/lib -lmysqlclient
如果你采用動(dòng)態(tài)模塊安裝,如果是初次安裝,修改語(yǔ)句不同,具體查看PHP的INSATLL文件。]

然后執(zhí)行:
./configure --prefix=/home/apache (prefix=是指定存放路徑。不帶prefix,默認(rèn)的是/usr/local/apache)
(也可以直接執(zhí)行./configure --prefix=/home/apache
--activate-module=src/modules/php4/libphp4.a )
make
make install

9)進(jìn)入 php-4.0.6 執(zhí)行
cp php.ini-dist /usr/local/lib/php.ini

10)啟動(dòng)APACHE: ./home/apache/bin/apachectl start

11)運(yùn)行你的phpinfo()程序,默認(rèn)APACHE的根目錄是/usr/local/apache/htdocs/ 。如過(guò)跟上面WINDOWS中顯示一樣,那就恭喜你安裝成功了,可以支持PHP+GD+JPEG+PNG了。不行的話,重裝試試。

另外,在gd-1.8.3中有個(gè)GIF的補(bǔ)丁,我試過(guò)沒(méi)有成功,看來(lái)要版本很低的LINUX才行,如果你成功了,或者在LINUX6.1以上版本中有什么其他辦法實(shí)現(xiàn)PHP+GD+GIF,麻煩告訴我(E_mail:UBs@ynmail.com)
如果要用GIF圖形,操作如下,把上面步驟:6a換成6b
使用gd-1.8.3,加上GIF補(bǔ)丁編譯,使GD庫(kù)包含GIF庫(kù):
6b)下載:http://www.boutell.com/gd/http/gd-1.8.3.tar.gz
下載補(bǔ)丁:http://www.webofsin.com/gd-1.8.3-gif.patch
解開(kāi),進(jìn)入gd-1.8.3
打上GIF的補(bǔ)丁:patch -p0 <gd-1.8.3-gif.patch
File to patch: gd.c
然后此目錄中多了一個(gè)gd-1.8.3/gd_gif.c

修改Makefile,基本同上。
此后,編譯并安裝:
其他步驟同上,只要把gd-1.8.4換成gd-1.8.3 。

二,PHP中大圖縮小圖的程序?qū)嵗海ㄔ赪INDOWS和LINUX平臺(tái)都調(diào)試通過(guò)了。)
1)上傳圖片頁(yè)面:(片段)
在<head></head>中間加入下面程序,(這段程序很有用,可以在前臺(tái),用戶(hù)端判斷用戶(hù)上傳的文件類(lèi)型,控制用戶(hù)的上傳文件)
<script language="JavaScript">
<!--
function CheckForm(theForm)
{
var fileext=theForm.zhaopian_up.value.substring(theForm.zhaopian_up.value.length-4,theForm.zhaopian_up.value.length)
fileext=fileext.toLowerCase()
if (!(fileext=='.jpg' fileext=='.png'))
{alert("對(duì)不起,不正確的照片文件,必須為*.jpg或*.png文件 !");
theForm.zhaopian_up.focus();
return false;
}
return true;
}
// -->

頁(yè)面中加入上傳表單:
<FORM ENCTYPE="multipart/form-data" ACTION="photo_upload2.php" METHOD="POST" onsubmit="return CheckForm(this)">
注:請(qǐng)先上傳照片,后填下表。第一張為封面照片,只能傳jpg圖片,小于300K,少于9張。
<p class="big"> 上傳照片:</p>
<input type="file" name="zhaopian_up" size="20"> <INPUT TYPE="submit" value="上傳">
</form>

2)處理頁(yè)面程序,包含判斷圖片大小,上傳拷貝,縮圖,生成小圖文件,圖片ID存入數(shù)據(jù)庫(kù)等:(片段)
<?
//取得上傳文件大小,300K:
if ($zhaopian_up_size>307200) {
$wrong_massage="對(duì)不起,你上傳的文件大小超過(guò)了300K,請(qǐng)縮小圖再傳!";
Header("Location:include/wrong_massage.php?wrong_massage=$wrong_massage");
exit();
}
//自動(dòng)縮圖$srcFile原文件,大圖;$photo_small目標(biāo)文件,小圖;$dstW,$dstH是小圖的寬,高。
function makethumb($srcFile,$photo_small,$dstW,$dstH) {
$data = GetImageSize($srcFile,&$info);
switch ($data[[2]]) {
case 1: //圖片類(lèi)型,1是GIF圖
$im = @ImageCreateFromGIF($srcFile);
break;
case 2: //圖片類(lèi)型,2是JPG圖
$im = @imagecreatefromjpeg($srcFile);
break;
case 3: //圖片類(lèi)型,3是PNG圖
$im = @ImageCreateFromPNG($srcFile);
break;
}
$srcW=ImageSX($im);
$srcH=ImageSY($im);
$ni=ImageCreate($dstW,$dstH);
ImageCopyResized($ni,$im,0,0,0,0,$dstW,$dstH,$srcW,$srcH);
ImageJpeg($ni,$photo_small);
//ImageJpeg($ni); //在顯示圖片時(shí)用,把注釋取消,可以直接在頁(yè)面顯示出圖片。
}
$srcFile=$zhaopian_up;
//取得文件擴(kuò)展名:
$type=substr(strrchr($zhaopian_up_name,"."),1);
$photo_ID=time();
$photo_path="user_picture/$user/";
if(is_dir($photo_path)!=TRUE) mkdir($photo_path,0777);
$photo_small=$photo_path."/".$photo_ID."_s.".$type; //小圖
$photo_s=fopen($photo_small,"w+");
if ($type=="png" $type=="jpg") makethumb($srcFile,$photo_small,110,130);//110,130為小圖寬,高
?>

在顯示圖片的程序中,只需從數(shù)據(jù)庫(kù)中讀出圖片ID,用$photo_path."/".$photo_ID."_s.".$type就是顯示小圖,加個(gè)鏈接,就可以顯示大圖$photo_path."/".$photo_ID.".".$type;
在我的一個(gè)程序中有此功能,正在測(cè)試:www1.yn.cninfo.net/love