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

  •   2009-07-31/22:59
  • 问题:安装蓝点Linux2.0后,进行PHP编程,发现只能处理GIF图像,不能处理JPEG图像。后来知道PHP处理图像,使用了GD库,而GD库开始时是支持GIF的,但由于GIF使用了有版权争议的LZW算法,会引起法律问题,于是从GD-1.6开始,GD库不再支持GIF,改为支持更好的,无版权争议的PNG。而我现在希望同时支持GIF,PNG和JPEG。经过尝试,我成功地做到了这一点。下面介绍具体做法。我的配置为:蓝点Linux2.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、当前状态查看
    安装蓝点Linux2.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
    解开压缩文件:
    tarxzvfjpegsrc.v6b.tar.gz
    命令完成后多了一个子目录jpeg-6b,Jpeg的源码文件就在其中。
    进入该子目录:
    cdjpeg-6b
    该目录中的install.doc文件详细介绍了如何安装Jpeg,照章行事即可。
    配置生成Makefile文件:
    ./configure
    命令完成后该目录下多了个Makefile文件。Makefile文件是许多软件编译、安装的配置和过程控制文件,十分重要,应该学会看懂它的内容。
    开始编译:
    make
    命令完成后该目录下多了许多文件,其中重要的是libjpeg.a和libjpeg.so。
    安装:
    makeinstall
    命令完成后,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
    解开压缩文件:
    tarxzvfgd-1.8.3.tar.gz
    命令完成后多了一个子目录gd-1.8.3,GD的源码文件就在其中。
    给源码打补丁:
    patch-p0命令完成后gd-1.8.3子目录下多了个gd_gif.c文件,而文件gd.h和Makefile也被作了相应修改。
    进入该子目录:
    cdgd-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
    makeinstall
    命令完成后,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
    tarxzvfphp-4.0.1pl2.tar.gz
    命令完成后多了一个子目录php-4.0.1pl2,PHP的源码文件就在其中。
    进入该子目录:
    cdphp-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中makeinstall的结果而指定的。
    (由于命令太长,建议写成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执行之:
    shmy-php-conf
    效果是一样的。)
    命令完成后该目录下多了个Makefile文件。
    编译并安装:
    make
    makeinstall
    命令完成后,libphp4.so被拷到/usr/lib/apache目录下。

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

    5、实例测试
    再次按步骤0的说明检查当前状态,我已经看到,PHP改成了新的版本号,GD库也同时支持GIF和JPEG了。
    但我还是想用实例来测试一下,这个例子的功能是读取一个gif文件,生成缩图,然后保存为另一个jpg文件。文件create-thumb.php的内容如下:
    <?
    functionCreateThumbnail($srcFile,$dstFile,$dstW,$dstH)
    {
    $data=GetImageSize($srcFile,&$info);
    switch($data[2]){
    case1:
    $im=@ImageCreateFromGIF($srcFile);
    break;
    case2:
    $im=@ImageCreateFromJPEG($srcFile);
    break;
    case3:
    $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。

    大功告成,班师回朝。



    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多