配置PHP使之能同时支持GIF和JPEG


Posted in PHP onOctober 09, 2006

问题:安装蓝点Linux 2.0后,进行PHP编程,发现只能处理GIF图像,不能处理JPEG图像。后来知道PHP处理图像,使用了GD库,而GD库开始时是支持GIF的,但由于GIF使用了有版权争议的LZW算法,会引起法律问题,于是从GD-1.6开始,GD库不再支持GIF,改为支持更好的,无版权争议的PNG。而我现在希望同时支持GIF,PNG和JPEG。经过尝试,我成功地做到了这一点。下面介绍具体做法。我的配置为:蓝点Linux 2.0,Kernel-2.2.16,MySQL-3.23.10alpha,Apache-1.3.12,PHP4.0.1pl2,gd-1.8.3,Jpeg6b。

我将按照由底向上的顺序介绍,即Jpeg->GD->PHP->Apache。

0、 当前状态查看
安装蓝点Linux 2.0后,Kernel,MySQL,Apache未做任何改变,看看当前状态如何。
创建一PHP文件,名为info.php,放于Apahce的文档目录下(/etc/httpd/html),其内容如下:
<? phpinfo(); ?>
文件就只有1行。用浏览器打开该文件URL(我的hostname为zhangzh):
http://zhangzh/info.php
如果Apache/PHP正常运行的话,页面中将会列出PHP版本,Apache版本,以及其他各种有用的信息。我关心的是GD库部分,看看它是否支持GIF、JPEG,结果发现支持GIF而不支持JPEG。

1、 Jpeg6b的安装和配置
Jpeg的主要文件有jpeglib.h, libjpeg.a, libjpeg.so等。首先检查系统中安装了没有,到/usr/include目录下看有无jpeglib.h,到/usr/lib目录下看有无libjpeg.a和libjpeg.so。我的系统中没有,因而要安装。
获取Jpeg源码的地址为:
ftp://ftp.uu.net/graphics/jpeg/
取得的文件为jpegsrc.v6b.tar.gz,放于/usr/src目录下。
进入/usr/src目录中,开始安装过程。
进入/usr/src:
cd /usr/src
解开压缩文件:
tar xzvf jpegsrc.v6b.tar.gz
命令完成后多了一个子目录jpeg-6b,Jpeg的源码文件就在其中。
进入该子目录:
cd jpeg-6b
该目录中的install.doc文件详细介绍了如何安装Jpeg,照章行事即可。
配置生成Makefile文件:
./configure
命令完成后该目录下多了个Makefile文件。Makefile文件是许多软件编译、安装的配置和过程控制文件,十分重要,应该学会看懂它的内容。
开始编译:
make
命令完成后该目录下多了许多文件,其中重要的是libjpeg.a和libjpeg.so。
安装:
make install
命令完成后,jpeglib.h被拷到/usr/local/include目录下,libjpeg.a和libjpeg.so被拷到/usr/local/lib目录下。

2、 GD-1.8.3的安装和配置
GD的主要文件有gd.h, libgd.a等。
获取GD源码的地址为:
http://www.boutell.com/gd/
取得的文件为gd-1.8.3.tar.gz,放于/usr/src目录下。
已知道该版本的GD不支持GIF,但想来象我一样希望GD同时支持GIF和JPEG的人不少,于是有人做了个补丁,把对GIF的支持加回去了。看起来这是个英国人吧,他的Email地址为adam@elysium.ltd.uk。
获取补丁源码的地址为:
http://www.webofsin.com/gd-1.8.3-gif.patch
取得的文件为gd-1.8.3-gif.patch,放于/usr/src目录下。
进入/usr/src:
cd /usr/src
解开压缩文件:
tar xzvf gd-1.8.3.tar.gz
命令完成后多了一个子目录gd-1.8.3,GD的源码文件就在其中。
给源码打补丁:
patch -p0 命令完成后gd-1.8.3子目录下多了个gd_gif.c文件,而文件gd.h和Makefile也被作了相应修改。
进入该子目录:
cd gd-1.8.3
缺省情况下,GD库编译时并不加入JPEG支持,得修改Makefile文件。
修改Makefile文件,使得:
CFLAGS=-O -DHAVE_XPM -DHAVE_JPEG -DHAVE_LIBTTF
LIBS=-lm -lgd -lpng -lz -ljpeg -lttf -lXpm -lX11
此后,编译并安装: 
make
make install
命令完成后,gd.h被拷到/usr/local/include目录下,libgd.a被拷到/usr/local/lib目录下。

3、 PHP-4.0.1pl2的安装和配置
PHP的主要文件有libphp4.a, libphp4.so等。
获取PHP源码的地址为:
http://php.net
取得的文件为php-4.0.1pl2.tar.gz,放于/usr/src目录下。
进入/usr/src目录并解压文件:
cd /usr/src
tar xzvf php-4.0.1pl2.tar.gz
命令完成后多了一个子目录php-4.0.1pl2,PHP的源码文件就在其中。
进入该子目录:
cd php-4.0.1pl2
该目录中的INSTALL文件详细介绍了如何安装PHP,照章行事即可。
配置生成Makefile文件:
./configure '--with-apxs=/usr/sbin/apxs' '--with-mysql' 
'--with-config-file-path=/etc/httpd' '--enable-safe-mode' 
'--with-system-regex' '--disable-debug' 
'--with-zlib' '--enable-magic-quotes' '--enable-track-vars' 
'--with-jpeg-dir=/usr/local' '--with-gd=/usr/local'
注意最后一行参数'--with-jpeg-dir=/usr/local' '--with-gd=/usr/local',指明了Jpeg和GD的目录为/usr/local,这是根据步骤1、2中make install的结果而指定的。
(由于命令太长,建议写成shell文件再执行。文件my-php-conf内容如下:
#! /bin/sh
./configure '--with-apxs=/usr/sbin/apxs' '--with-mysql' 
'--with-config-file-path=/etc/httpd' '--enable-safe-mode' 
'--with-system-regex' '--disable-debug' 
'--with-zlib' '--enable-magic-quotes' '--enable-track-vars' 
'--with-jpeg-dir=/usr/local' '--with-gd=/usr/local'
用shell执行之:
sh my-php-conf
效果是一样的。)
命令完成后该目录下多了个Makefile文件。
编译并安装:
make
make install
命令完成后,libphp4.so被拷到/usr/lib/apache目录下。

4、 Apache的配置
Apache本身不必重新编译安装,但使用了新的PHP,须让Apache知道,得修改Apache的配置文件并重启Apache服务。
修改Apache配置文件/etc/httpd/conf/httpd.conf,使得文件中包含以下几行:
LoadModule php4_module modules/libphp4.so
AddModule mod_php4.c
AddType application/x-httpd-php .php3 .php
同时注意把旧的php3的相应行注释掉,否则会出现冲突而使Apache重启失败。
重启Apache服务:
/etc/rc.d/init.d/httpd restart

5、 实例测试
再次按步骤0的说明检查当前状态,我已经看到,PHP改成了新的版本号,GD库也同时支持GIF和JPEG了。
但我还是想用实例来测试一下,这个例子的功能是读取一个gif文件,生成缩图,然后保存为另一个jpg文件。文件create-thumb.php的内容如下:
<?
function CreateThumbnail($srcFile, $dstFile, $dstW, $dstH)
{
$data = GetImageSize($srcFile,&$info);
switch ($data[2]) {
case 1:
$im = @ImageCreateFromGIF($srcFile);
break;
case 2:
$im = @ImageCreateFromJPEG($srcFile);
break;
case 3:
$im = @ImageCreateFromPNG($srcFile);
break;
}
$srcW=ImageSX($im);
$srcH=ImageSY($im);
if ($srcW <= $dstW && $srcH <= $dstH)
ImageJPEG($im,$dstFile);
else
{
if(($srcW / $srcH) > ($dstW / $dstH))
$dstH = $dstW * $srcH / $srcW;
else
$dstW = $dstH * $srcW / $srcH;
$ni=ImageCreate($dstW,$dstH);
ImageCopyResized($ni,$im,0,0,0,0,$dstW,$dstH,$srcW,$srcH);
ImageJPEG($ni,$dstFile);
}
}
CreateThumbnail("./test.gif", "./test-tn.jpg", 80, 80);
?>
把该文件放于Apahce的文档目录下(/etc/httpd/html),同时把测试用的图像文件test.gif也放于该目录下,然后用浏览器打开该php文件(我的hostname为zhangzh):
http://zhangzh/create-thumb.php
没出错信息。再看Apahce的文档目录(/etc/httpd/html),多了一个缩图文件test-tn.jpg。

大功告成,班师回朝。

PHP 相关文章推荐
人大复印资料处理程序_补充篇
Oct 09 PHP
php4的session功能评述(一)
Oct 09 PHP
一些使用频率比较高的php函数
Oct 03 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
php rsa加密解密使用详解
Jan 14 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
php上传大文件设置方法
Apr 14 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
php显示页码分页类的封装
Jun 08 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
PHP输出控制功能在简繁体转换中的应用
Oct 09 #PHP
PHP 增加了对 .ZIP 文件的读取功能
Oct 09 #PHP
如何去掉文章里的 html 语法
Oct 09 #PHP
如何分别全角和半角以避免乱码
Oct 09 #PHP
玩转虚拟域名◎+ .
Oct 09 #PHP
桌面中心(四)数据显示
Oct 09 #PHP
桌面中心(一)创建数据库
Oct 09 #PHP
You might like
PHP脚本的10个技巧(3)
2006/10/09 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python守护进程(daemon)代码实例
2015/03/06 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
StringBuilder和String的区别
2015/05/18 面试题
家具促销活动方案
2014/02/16 职场文书
空乘英文求职信
2014/04/13 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
上班迟到检讨书
2014/09/15 职场文书
房租涨价通知
2015/04/23 职场文书
雾霾停课通知
2015/04/24 职场文书
九年级英语教学反思
2016/02/15 职场文书