时间:2021-05-20
本文实例讲述了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程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文就通过一个简单的实例,向大家展示了在VisualC#中如何运用GDI+和Unsafe代码类等技术以实现简单的数字图像处理。一.概述本文的实例是一个数字图像处
本文实例为大家分享了SVM手写数字识别功能的具体代码,供大家参考,具体内容如下1、SVM手写数字识别识别步骤:(1)样本图像的准备。(2)图像尺寸标准化:将图像
本文实例讲述了Python图像处理之简单画板实现方法。分享给大家供大家参考,具体如下:Python图像处理也是依赖opencv的Python接口实现的,Pyth
本文实例讲述了Python图像处理实现两幅图像合成一幅图像的方法。分享给大家供大家参考,具体如下:将两幅图像合成一幅图像,是图像处理中常用的一种操作,pytho
本文实例讲述了C++将CBitmap类中的图像保存到文件的方法。分享给大家供大家参考。具体实现方法如下:使用下面的代码,可以把CBitmap类中的图像保存到图像