PHP中实现大图自动缩成小图(及GD库的安装)
|
我觉得网络编程与普通编程最大的区别就是,网络编程除了具备普通编程的特性外,还要花很大精力考虑速度的问题。 网站上需要很多图片,现在有很多给用户存放照片,图片的“像册”程序,可以让用户自己上传图片,然后自动缩成小图,可以让你在一个页面看到很多小图,然后点击小图看大图。 先简单说说GIF,JPG,PNG,BMP图的区别:他们都是图形压缩格式。GIF格式单图最多能显示256种颜色,可以保存多图,适合做小动画,容量较大。 JPEG格式,支持24位(16 百万)种颜色,适合于静态图,容量较小。PNG格式,包含GIF,JPEG的所有特点,支持48位颜色,但是容量较大,而且应用不广泛。 BMP格式,颜色少,非常老的压缩格式,对于网络来说太大了。 PHP 在 3.0.13 版之后,终于支持了 PNG 的图型格式,使用 PNG 就不怕会有版权的问题了,而且在 PHP 这个版本以后,安装编译时会检查 GD library 支持的是旧的 GIF 格式还是新的 PNG 格式来决定是否使用 GIF 或 PNG 的专用函数。
1.环境:windows2000server PHP4.0.4 GD IIS 在WINDOWS中安装很容易,PHP4.0以上版本中自带,装好后在php4/extensions 目录中自带动态链接库:php_gd.dll 。只要在php.ini 中把 ;extension=php_gd.dll 前面的;去掉,然后重起WEBSERVER(IIS或APACHE),就行了。运行一个带有<? phpinfo();?>的PHP程序,里面有以下内容就说明可以用了:
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
呵呵,搞定后你的phpinfo()就会多显示一个GIF Support enabled ,但是涉及到版权问题,自己看着办吧。 在LINUX装GD库就比较麻烦了,先简单说说关于APACHE和PHP的安装:当我们在Apache环境下安装PHP的时候,你有三种安装模式可供选择:静态模块、动态模块(DSO)和CGI。 常用的是静态模块,就是APACHE和PHP在一起编译,这样PHP的执行效率高一些,但是PHP要升级或要装GD库之类的附加库时就要把两个都重新编译,很麻烦。动态模块就好办多了,单独重新 1)下载所需的库: 下载zlib: 下载libpng:建议使用libpng-1.0.6-1-src.tar.gz 下载jpegsrc.v6b.tar.gz: 以下步骤需要按顺序执行: 2)我用的是LINUX6.1,内核是2.2.12。以ROOT进入,解压所有包,tar -zxvf filename 。然后编译: 3)如果你的LINUX没有安装zlib,必须先安装zilb,进入zlib-1.1.3 执行: 4)进入libpng-1.0.6,可以在LINUX,或DOS下安装,LINUX下需要拷贝他的makefile文件, 执行: 5)进入jpeg-6b 执行: 6a)进入gd-1.8.4 或者,如果你FREETYPE,XPM,TTF等库都安装了,(安装方法大同小异,自己去找库吧),就改下面: #LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lm -lttf 此后,编译并安装: (如果需要MYSQL,而你没装,就先装MYSQL,解压,执行: ./configure ; make ; make install
7.1)解压进入apache_1.3.20,需要先考些文件,执行: 7.2)解压进入php-4.0.6,编译安装: 8)如果你的PHP是和APACHE一起编译的,静态模块,就要重新编译APACHE,我用的是apache_1.3.20 然后执行: 9)进入 php-4.0.6 执行 10)启动APACHE: ./home/apache/bin/apachectl start 11)运行你的phpinfo()程序,默认APACHE的根目录是/usr/local/apache/htdocs/ 。如过跟上面WINDOWS中显示一样,那就恭喜你安装成功了,可以支持PHP GD JPEG PNG了。不行的话,重装试试。 另外,在gd-1.8.3中有个GIF的补丁,我试过没有成功,看来要版本很低的LINUX才行,如果你成功了,或者在LINUX6.1以上版本中有什么其他办法实现PHP+GD+GIF,麻烦告诉我(E_mail:UBs@ynmail.com) 如果要用GIF图形,操作如下,把上面步骤:6a换成6b 6b)下载:http://www.boutell.com/gd/http/gd-1.8.3.tar.gz 修改Makefile,基本同上。
1)上传图片页面:(片段) 在<head></head>中间加入下面程序,(这段程序很有用,可以在前台,用户端判断用户上传的文件类型,控制用户的上传文件)
<!-- 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("对不起,不正确的照片文件,必须为*.jpg或*.png文件 !"); theForm.zhaopian_up.focus(); return false; } return true; } // -->
注:请先上传照片,后填下表。第一张为封面照片,只能传jpg图片,小于300K,少于9张。 <p class="big"> 上传照片:</p> <input type="file" name="zhaopian_up" size="20"> <INPUT TYPE="submit" value="上传"> </form>
//取得上传文件大小,300K: if ($zhaopian_up_size>307200) { $wrong_massage="对不起,你上传的文件大小超过了300K,请缩小图再传!"; Header("Location:include/wrong_massage.php?wrong_massage=$wrong_massage"); exit(); } //自动缩图$srcFile原文件,大图;$photo_small目标文件,小图;$dstW,$dstH是小图的宽,高。 function makethumb($srcFile,$photo_small,$dstW,$dstH) { $data = GetImageSize($srcFile,&$info); switch ($data[[2]]) { case 1: //图片类型,1是GIF图 $im = @ImageCreateFromGIF($srcFile); break; case 2: //图片类型,2是JPG图 $im = @imagecreatefromjpeg($srcFile); break; case 3: //图片类型,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); //在显示图片时用,把注释取消,可以直接在页面显示出图片。 } $srcFile=$zhaopian_up; //取得文件扩展名: $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为小图宽,高 ?>
在显示图片的程序中,只需从数据库中读出图片ID,用$photo_path."/".$photo_ID."_s.".$type就是显示小图,加个链接,就可以显示大图$photo_path."/".$photo_ID.".".$type; 在我的一个程序中有此功能,正在测试:www1.yn.cninfo.net/love
源代码网供稿. |
