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程序设计有所帮助。