欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JMagick 进行基本图像处理的一个类,jmagick一个类,JMagick是一个开源

来源: javaer 分享于  点击 41610 次 点评:243

JMagick 进行基本图像处理的一个类,jmagick一个类,JMagick是一个开源


JMagick是一个开源API,利用JNI(Java NativeInterface)技术实现了对ImageMagickAPI的Java访问接口,因此也将比纯Java实现的图片操作函数在速度上要快。

JMagickHandler.java

/** *  JMagickHandler.java *   *  Author: Winter Lau *  2007-7-11 */package com.eportal.img;import java.awt.Dimension;import java.io.File;import org.apache.commons.io.FileUtils;import com.gif4j.GifDecoder;import com.gif4j.GifEncoder;import com.gif4j.GifImage;import com.gif4j.GifTransformer;import dlog.common.util.StringUtils;import magick.ImageInfo;import magick.MagickException;import magick.MagickImage;/** * 使用JMagick进行图像处理 */class JMagickHandler {    private final static int DEFAULT_QUALITY = 90;    protected JMagickHandler(){}    private final static ThreadLocal<MyMagickImage> tLocal = new ThreadLocal<MyMagickImage>();    private String lastSrc = null;    /**     * 清除线程本地存储信息     */    private synchronized MyMagickImage getMagickImage(String src) throws Exception {        MyMagickImage mi = tLocal.get();        if(mi != null && StringUtils.equals(src, lastSrc))            return mi;        else if(mi != null)            tLocal.remove();        this.lastSrc = src;        ImageInfo info = new ImageInfo(src);        mi = new MyMagickImage(info);        tLocal.set(mi);        return mi;    }    @Override    public void cleanup() {        MyMagickImage mi = tLocal.get();        if(mi != null)            mi.destroyImages();        tLocal.remove();    }    @Override    public ImageExtInfo getImageInfo(String src) throws Exception {        try{            MagickImage image = this.getMagickImage(src);            ImageExtInfo ext = new ImageExtInfo();            Dimension dim = image.getDimension();            ext.setWidth((int)dim.getWidth());            ext.setHeight((int)dim.getHeight());            ext.setSize(image.sizeBlob());            ext.setAnimated(image.isAnimatedImage());            return ext;        }catch(MagickException e){            return new PureJavaHandler().getImageInfo(src);        }    }    private final static boolean hasUnicode(String str){        return str.getBytes().length != str.length();    }    @Override    public void resize(String src, String dest, int width, int height, int quality) throws Exception {        boolean u_src = hasUnicode(src);        MyMagickImage image;        File srctmp = null;        if(u_src){            srctmp = File.createTempFile("jmagick_s_" + src.hashCode(), null);            FileUtils.copyFile(new File(src), srctmp);            image = this.getMagickImage(srctmp.getAbsolutePath());        }        else            image = this.getMagickImage(src);        image.getImageInfo().setQuality((quality>0)?quality:DEFAULT_QUALITY);        MagickImage scaledimage = null;        try{            if(image.isAnimatedImage()){                GifImage gifImage = GifDecoder.decode(new File(src));                GifImage newGif = GifTransformer.resize(gifImage, width, height, false);                                GifEncoder.encode(newGif, new File(dest));            }            else{//others                scaledimage = image.scaleImage(width, height);                scaledimage.setImageFormat("JPEG");                scaledimage.profileImage("*", null);                boolean u_dest = hasUnicode(dest);                if(u_dest){                    File tmp = File.createTempFile("jmagick_d_" + dest.hashCode(), null);                    scaledimage.setFileName(tmp.getAbsolutePath());                     scaledimage.writeImage(image.getImageInfo());                    FileUtils.copyFile(tmp, new File(dest));                    FileUtils.forceDelete(tmp);                }                else{                    scaledimage.setFileName(dest);                     scaledimage.writeImage(image.getImageInfo());                }            }                   }finally{            if(srctmp != null) FileUtils.forceDelete(srctmp);            if(scaledimage != null)                scaledimage.destroyImages();                    }    }    @Override    public void rotate(String src, String dest, double degrees) throws Exception {        boolean u_src = hasUnicode(src);        MyMagickImage image;        File srctmp = null;        if(u_src){            srctmp = File.createTempFile("jmagick_s_" + src.hashCode(), null);            FileUtils.copyFile(new File(src), srctmp);            image = this.getMagickImage(srctmp.getAbsolutePath());        }        else            image = this.getMagickImage(src);        try{            MagickImage rotateImg = image.rotateImage(degrees);            rotateImg.profileImage("*", null);            boolean u_dest = hasUnicode(dest);            if(u_dest){                File tmp = File.createTempFile("jmagick_d_" + dest.hashCode(), null);                rotateImg.setFileName(tmp.getAbsolutePath()); // convert to png                rotateImg.writeImage(image.getImageInfo());                rotateImg.destroyImages();                FileUtils.copyFile(tmp, new File(dest));                FileUtils.forceDelete(tmp);            }            else{                rotateImg.setFileName(dest); // convert to png                rotateImg.writeImage(image.getImageInfo());                rotateImg.destroyImages();                          }        }finally{            if(srctmp != null)                FileUtils.forceDelete(srctmp);        }    }    private static class MyMagickImage extends MagickImage {        private ImageInfo imageInfo;        public ImageInfo getImageInfo() {            return imageInfo;        }        public MyMagickImage(ImageInfo info) throws MagickException{            super(info);            this.imageInfo = info;        }    }    @Override    public void cropImage(String src, int width, int height, int point,            int point2, String dst) throws Exception {        // TODO Auto-generated method stub    }}
相关栏目:

用户点评