国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JMagick實現基本圖像處理的類實例

2019-11-26 15:07:47
字體:
來源:轉載
供稿:網友

本文實例講述了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 保山市| 汽车| 龙口市| 山阴县| 叶城县| 堆龙德庆县| 许昌市| 当涂县| 永川市| 宝兴县| 尖扎县| 浑源县| 从化市| 郓城县| 建湖县| 怀来县| 定西市| 广宁县| 乐安县| 乌什县| 湖州市| 任丘市| 泸定县| 梨树县| 惠州市| 周口市| 裕民县| 秦皇岛市| 深水埗区| 宁强县| 尼勒克县| 南投县| 潮安县| 舞钢市| 株洲市| 海宁市| 尼玛县| 应用必备| 永新县| 红河县| 扶沟县|