服务器端图形处理

Java最初是以Applet等客户端图形处理为技术起点的,而本节讨论的是如何在Servlet/JSP中实现图形处理。
在Jive中,图片可以用来显示用户的头像,用户在上传自己头像图片时,该图片的大小可能不一,但是由于版面原因,显示的头像图片又有大小限制,那么就需要在用户上传图片时对图片大小做一个检查。如果超过规定大小,就进行一定的缩放处理。
缩放处理有两种方式:是在HTML显示时,使用image 语法的width和height来限制大小,但是这样做只是解决了表面问题,无法解决大字节图片传送到客户端带来的性能影响,这个图片因为是用户发言的头 像,将会在每个帖子里面显示。如果头像都是巨大图片,对帖子显示速度的影响是很大,因此必须在服务器端进行缩小后,再传送到客户端,这样提高了论坛系统性 能。
服务器端的图形处理需要使用到Java的图形处理技术,而且图形处理是在服务器端的Web容器中进行的。和以往Java在客户端进行图形处理稍微有所不同,相同的是都要使用计算机的底层图形支持资源。
J2SE 1.4提供新的增强的图形处理功能,JDK1.4中最新的javax.imageio.ImageIO对图片进行读写操作,而使用java.awt.geom.AffineTransform对图片进行尺寸缩放处理。
import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.image.AffineTransformOp;
import javax.imageio.ImageIO;
import java.awt.geom.AffineTransform;
 
public class UploadImg{
     /**
     * 参数设置
     * @param fromdir 图片的原始目录
     * @param todir 处理后的图片存放目录
     * @param imgfile 原始图片
     * @param sysimgfile 处理后的图片文件名前缀
     */
           public void init(String fromdir,String todir,String imgfile,String sysimgfile)
           {
                  this.fromdir=fromdir;
                  this.todir=todir;
                  this.imgfile=imgfile;
                  this.sysimgfile=sysimgfile;
             }
    …
    public boolean CreateThumbnail() throws Exception
    {
        //ext是图片的格式 gif、JPG 或png
        String ext=""
        double Ratio=0.0;
        File oldFile = new File(fromdir,imgfile);
        if (!F.isFile())  //检查是否存在此图片文件
             throw new Exception(F+" is not image file error in CreateThumbnail!");
 
         //首先判断上传的图片是gif还是JPG ImageIO,只能将gif转换为png
         if (isJpg(imgfile)){
            ext="jpg";
        }else{
           ext="png";
        }
        File newFile = new File(todir,sysimgfile+"."+ext);
 
        BufferedImage Bi = ImageIO.read(oldFile);  //读取原始图片
        if ((Bi.getHeight()>120) || (Bi.getWidth()>120)){
            if (Bi.getHeight()>Bi.getWidth())
              Ratio = 120.0/Bi.getHeight();
            else
              Ratio = 120.0/Bi.getWidth();
       }
       //进行图片转换
       AffineTransformOp op =
          new AffineTransformOp(AffineTransform.getScaleInstance(Ratio, Ratio), null);
       Image itemp = op.filter(Bi, null);
 
       try { //写入转换后的图片
           ImageIO.write((BufferedImage) itemp, ext, newFile);
       }catch (Exception ex) {
            throw new Exception(ex.getMessage());
       }
       return (true);
   }
}
该类中由于使用到了Java 的AWT,虽然没有实际显示,但Linux系统下需要X11 Windows的支持(安装Linux时需安装 XFree86,Linux完全安装方式包括安装XFree86)。
该缩放功能是在图片上传到服务器后再进行的处理,可以对JPG进行缩小放大;对上传是GIF的图片,缩放后变成PNG图片格式文件
 
posted @ 2007-04-05 10:33  lovingprince  阅读(467)  评论(0编辑  收藏  举报