当前位置: 移动技术网 > IT编程>开发语言>Java > JMagick实现基本图像处理的类实例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

本文实例讲述了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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网