package org.zoo.hippo.utils;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;
import org.im4java.core.Stream2BufferedImage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author yankai913@gmail.com
* @date 2015-1-20
*/
public class ImageTool {
private static final Logger logger = LoggerFactory.getLogger(ImageTool. class );
private static String METHOD_SAMPLE = "sample" ;
private static String METHOD_RESIZE = "resize" ;
private static String METHOD_THUMBNAIL = "thumbnail" ;
private static String METHOD_SCALE = "scale" ;
private static IMOperation createIMOperation( double quality, String suffix, int width, int height,
String method) {
IMOperation op = new IMOperation();
op.addImage();
if (METHOD_SAMPLE.equals(method)) {
op.sample(width, height);
}
else if (METHOD_RESIZE.equals(method)) {
op.resize(width, height);
}
else if (METHOD_THUMBNAIL.equals(method)) {
op.thumbnail(width, height);
}
else {
op.scale(width, height);
}
op.quality(quality);
op.addImage( new String[] { suffix + ":-" });
return op;
}
public static byte [] sample( byte [] srcData, double quality, String suffix, int width, int height) {
return scale0(srcData, quality, suffix, width, height, METHOD_SAMPLE);
}
public static byte [] resize( byte [] srcData, double quality, String suffix, int width, int height) {
return scale0(srcData, quality, suffix, width, height, METHOD_RESIZE);
}
public static byte [] thumbnail( byte [] srcData, double quality, String suffix, int width, int height) {
return scale0(srcData, quality, suffix, width, height, METHOD_THUMBNAIL);
}
public static byte [] scale( byte [] srcData, double quality, String suffix, int width, int height) {
return scale0(srcData, quality, suffix, width, height, METHOD_SCALE);
}
private static byte [] scale0( byte [] srcData, double quality, String suffix, int width, int height,
String method) {
byte [] result = null ;
IMOperation op = createIMOperation(quality, suffix, width, height, method);
try {
ConvertCmd localConvertCmd = new ConvertCmd( true );
long s = System.currentTimeMillis();
ByteArrayInputStream bais = new ByteArrayInputStream(srcData);
BufferedImage inputImage = ImageIO.read(bais);
long s2 = System.currentTimeMillis();
logger.info( "inputStream ==> BufferedImage, take " + (s2 - s) + "ms" );
Stream2BufferedImage streamBuffered = new Stream2BufferedImage();
localConvertCmd.setOutputConsumer(streamBuffered);
localConvertCmd.run(op, new Object[] { inputImage });
long s3 = System.currentTimeMillis();
logger.info( "do convert, take " + (s3 - s2) + "ms" );
BufferedImage outputImage = streamBuffered.getImage();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(outputImage, suffix, baos);
long s4 = System.currentTimeMillis();
logger.info( "BufferedImage ==> outputStream, take " + (s4 - s3) + "ms" );
result = baos.toByteArray();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return result;
}
}
|