ImageMagick JMagick 进行基本图像处理的一个类

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

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

    }

}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:模拟Ping操作的一个Java类

下一篇:C#创建ini文件、读取值、修改值