/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.image; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.stream.MemoryCacheImageOutputStream; /** * Utility class for image operations. */ public final class ImageUtil { private final static float COMPRESSION_QUALITY = 0.85f; public static BufferedImage scaleImage( final BufferedImage image, final int newWidth, final int newHeight, final int bufferedImageType ) { int width = Math.max( 1, newWidth ); int height = Math.max( 1, newHeight ); final BufferedImage destImage = new BufferedImage( width, height, bufferedImageType ); final Image scaleImage = image.getScaledInstance( width, height, Image.SCALE_SMOOTH ); final Graphics2D g = destImage.createGraphics(); g.drawImage( scaleImage, 0, 0, width, height, null ); g.dispose(); return destImage; } public static BufferedImage readImage( byte[] data ) throws IOException { return readImage( new ByteArrayInputStream( data ) ); } public static BufferedImage readImage( InputStream input ) throws IOException { return ImageIO.read( input ); } public static BufferedImage readImage( File imageFile ) throws IOException { return ImageIO.read( imageFile ); } private static ImageWriter getImageWriter( String format ) throws IOException { Iterator i = ImageIO.getImageWritersByFormatName( format ); if ( i.hasNext() ) { return (ImageWriter) i.next(); } else { throw new IOException( "Failed to find writer for format [" + format + "]" ); } } public static void writeImage( BufferedImage image, String format, OutputStream out ) throws IOException { writeImage( image, format, out, COMPRESSION_QUALITY ); } public static void writeImage( BufferedImage image, String format, OutputStream out, float quality ) throws IOException { ImageWriter writer = getImageWriter( format ); MemoryCacheImageOutputStream imageOut = new MemoryCacheImageOutputStream( out ); writer.setOutput( imageOut ); ImageWriteParam params = writer.getDefaultWriteParam(); if ( params instanceof JPEGImageWriteParam ) { params.setCompressionMode( ImageWriteParam.MODE_EXPLICIT ); params.setCompressionQuality( quality ); } writer.write( null, new IIOImage( image, null, null ), params ); writer.dispose(); imageOut.flush(); imageOut.close(); } public static BufferedImage rotateImage90( BufferedImage image, final int bufferedImageType ) { int width = image.getWidth(); int height = image.getHeight(); BufferedImage destImage = new BufferedImage( height, width, bufferedImageType ); for ( int i = 0; i < width; i++ ) { for ( int j = 0; j < height; j++ ) { destImage.setRGB( height - 1 - j, i, image.getRGB( i, j ) ); } } return destImage; } public static BufferedImage rotateImage180( BufferedImage image, final int bufferedImageType ) { return rotateImage90( rotateImage90( image, bufferedImageType ), bufferedImageType ); } public static BufferedImage rotateImage270( BufferedImage image, final int bufferedImageType ) { return rotateImage90( rotateImage180( image, bufferedImageType ), bufferedImageType ); } }