JMagick实现基本图像处理的类实例

网友投稿 273 2023-08-01


JMagick实现基本图像处理的类实例

本文实例讲述了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 tLocal = new ThreadLocal();

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)63;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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java基于JDBC连接Oracle 11g Release2实例分析
下一篇:java读取wav文件(波形文件)并绘制波形图的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~