JMagick实现基本图像处理的类实例

所属分类: 软件编程 / java 阅读数: 45
收藏 0 赞 0 分享

本文实例讲述了JMagick实现基本图像处理的类。分享给大家供大家参考。具体分析如下:

JMagick是一个开源API,利用JNI(Java Native Interface)技术实现了对 ImageMagick API的Java访问接口,因此也将比纯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
  }
}

希望本文所述对大家的java程序设计有所帮助。

更多精彩内容其他人还在看

SpringBoot中使用Ehcache的详细教程

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。这篇文章主要介绍了SpringBoot中使用Ehcache的相关知识,需要的朋友可以参考下
收藏 0 赞 0 分享

在idea 中添加和删除模块Module操作

这篇文章主要介绍了在idea 中添加和删除模块Module操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java spring整合junit操作(有详细的分析过程)

这篇文章主要介绍了java spring整合junit操作(有详细的分析过程),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解JAVA 弱引用

这篇文章主要介绍了 JAVA 弱引用的相关资料,帮助大家更好的理解和学习java引用对象,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

深入了解JAVA 虚引用

这篇文章主要介绍了JAVA 虚引用的相关资料,帮助大家更好的理解和学习JAVA,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

详解JAVA 强引用

这篇文章主要介绍了JAVA 强引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

java中的按位与(&)用法说明

这篇文章主要介绍了java中的按位与(&)用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

深入了解JAVA 软引用

这篇文章主要介绍了JAVA 软引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

利用MyBatis实现条件查询的方法汇总

这篇文章主要给大家介绍了关于利用MyBatis实现条件查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Intellij IDEA 与maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.PathTranslator was bound

这篇文章主要介绍了Intellij IDEA 与maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.Pa
收藏 0 赞 0 分享
查看更多