JMagick实现基本图像处理的类实例
本文实例讲述了JMagick实现基本图像处理的类。分享给大家供大家参考。具体分析如下:
JMagick是一个开源API,利用JNI(JavaNativeInterface)技术实现了对ImageMagickAPI的Java访问接口,因此也将比纯Java实现的图片操作函数在速度上要快。
/**
*JMagickHandler.java
*
*Author:WinterLau
*2007-7-11
*/
packagecom.eportal.img;
importjava.awt.Dimension;
importjava.io.File;
importorg.apache.commons.io.FileUtils;
importcom.gif4j.GifDecoder;
importcom.gif4j.GifEncoder;
importcom.gif4j.GifImage;
importcom.gif4j.GifTransformer;
importdlog.common.util.StringUtils;
importmagick.ImageInfo;
importmagick.MagickException;
importmagick.MagickImage;
/**
*使用JMagick进行图像处理
*/
classJMagickHandler{
privatefinalstaticintDEFAULT_QUALITY=90;
protectedJMagickHandler(){}
privatefinalstaticThreadLocal<MyMagickImage>tLocal=newThreadLocal<MyMagickImage>();
privateStringlastSrc=null;
/**
*清除线程本地存储信息
*/
privatesynchronizedMyMagickImagegetMagickImage(Stringsrc)throwsException{
MyMagickImagemi=tLocal.get();
if(mi!=null&&StringUtils.equals(src,lastSrc))
returnmi;
elseif(mi!=null)
tLocal.remove();
this.lastSrc=src;
ImageInfoinfo=newImageInfo(src);
mi=newMyMagickImage(info);
tLocal.set(mi);
returnmi;
}
@Override
publicvoidcleanup(){
MyMagickImagemi=tLocal.get();
if(mi!=null)
mi.destroyImages();
tLocal.remove();
}
@Override
publicImageExtInfogetImageInfo(Stringsrc)throwsException{
try{
MagickImageimage=this.getMagickImage(src);
ImageExtInfoext=newImageExtInfo();
Dimensiondim=image.getDimension();
ext.setWidth((int)dim.getWidth());
ext.setHeight((int)dim.getHeight());
ext.setSize(image.sizeBlob());
ext.setAnimated(image.isAnimatedImage());
returnext;
}catch(MagickExceptione){
returnnewPureJavaHandler().getImageInfo(src);
}
}
privatefinalstaticbooleanhasUnicode(Stringstr){
returnstr.getBytes().length!=str.length();
}
@Override
publicvoidresize(Stringsrc,Stringdest,intwidth,intheight,intquality)throwsException{
booleanu_src=hasUnicode(src);
MyMagickImageimage;
Filesrctmp=null;
if(u_src){
srctmp=File.createTempFile("jmagick_s_"+src.hashCode(),null);
FileUtils.copyFile(newFile(src),srctmp);
image=this.getMagickImage(srctmp.getAbsolutePath());
}
else
image=this.getMagickImage(src);
image.getImageInfo().setQuality((quality>0)?quality:DEFAULT_QUALITY);
MagickImagescaledimage=null;
try{
if(image.isAnimatedImage()){
GifImagegifImage=GifDecoder.decode(newFile(src));
GifImagenewGif=GifTransformer.resize(gifImage,width,height,false);
GifEncoder.encode(newGif,newFile(dest));
}
else{//others
scaledimage=image.scaleImage(width,height);
scaledimage.setImageFormat("JPEG");
scaledimage.profileImage("*",null);
booleanu_dest=hasUnicode(dest);
if(u_dest){
Filetmp=File.createTempFile("jmagick_d_"+dest.hashCode(),null);
scaledimage.setFileName(tmp.getAbsolutePath());
scaledimage.writeImage(image.getImageInfo());
FileUtils.copyFile(tmp,newFile(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
publicvoidrotate(Stringsrc,Stringdest,doubledegrees)throwsException{
booleanu_src=hasUnicode(src);
MyMagickImageimage;
Filesrctmp=null;
if(u_src){
srctmp=File.createTempFile("jmagick_s_"+src.hashCode(),null);
FileUtils.copyFile(newFile(src),srctmp);
image=this.getMagickImage(srctmp.getAbsolutePath());
}
else
image=this.getMagickImage(src);
try{
MagickImagerotateImg=image.rotateImage(degrees);
rotateImg.profileImage("*",null);
booleanu_dest=hasUnicode(dest);
if(u_dest){
Filetmp=File.createTempFile("jmagick_d_"+dest.hashCode(),null);
rotateImg.setFileName(tmp.getAbsolutePath());//converttopng
rotateImg.writeImage(image.getImageInfo());
rotateImg.destroyImages();
FileUtils.copyFile(tmp,newFile(dest));
FileUtils.forceDelete(tmp);
}
else{
rotateImg.setFileName(dest);//converttopng
rotateImg.writeImage(image.getImageInfo());
rotateImg.destroyImages();
}
}finally{
if(srctmp!=null)
FileUtils.forceDelete(srctmp);
}
}
privatestaticclassMyMagickImageextendsMagickImage{
privateImageInfoimageInfo;
publicImageInfogetImageInfo(){
returnimageInfo;
}
publicMyMagickImage(ImageInfoinfo)throwsMagickException{
super(info);
this.imageInfo=info;
}
}
@Override
publicvoidcropImage(Stringsrc,intwidth,intheight,intpoint,
intpoint2,Stringdst)throwsException{
//TODOAuto-generatedmethodstub
}
}
希望本文所述对大家的java程序设计有所帮助。