JMagick实现基本图像处理的类实例
程序员文章站
2024-03-31 17:58:16
本文实例讲述了jmagick实现基本图像处理的类。分享给大家供大家参考。具体分析如下:
jmagick是一个开源api,利用jni(java native interfa...
本文实例讲述了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程序设计有所帮助。