发布于 2016-07-21 03:17:29 | 48 次阅读 | 评论: 0 | 来源: 网友投递
JMagick ImageMagick的Java接口
JMagick是一个开源API,利用JNI(Java Native Interface)技术实现了对ImageMagick API的Java访问接口,因此也将比纯Java实现的图片操作函数在速度上要快。JMagick只实现了ImageMagicAPI的一部分功能,它的发行遵循LGPL协议。
本文实例讲述了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程序设计有所帮助。