1 16 package com.blandware.atleap.webapp.util.core; 17 18 import javax.imageio.IIOImage ; 19 import javax.imageio.ImageIO ; 20 import javax.imageio.ImageReadParam ; 21 import javax.imageio.ImageReader ; 22 import javax.imageio.ImageWriteParam ; 23 import javax.imageio.ImageWriter ; 24 import javax.imageio.metadata.IIOMetadata ; 25 import javax.imageio.stream.ImageInputStream ; 26 import javax.imageio.stream.ImageOutputStream ; 27 import java.awt.geom.AffineTransform ; 28 import java.awt.image.AffineTransformOp ; 29 import java.awt.image.BufferedImage ; 30 import java.io.ByteArrayInputStream ; 31 import java.io.ByteArrayOutputStream ; 32 import java.io.IOException ; 33 import java.io.InputStream ; 34 import java.io.OutputStream ; 35 import java.util.Iterator ; 36 37 44 public class ImageUtil { 45 46 public static final String MIMETYPE_JPEG = "image/jpeg"; 47 public static final String MIMETYPE_GIF = "image/gif"; 48 public static final String MIMETYPE_PNG = "image/png"; 49 50 53 public ImageUtil() { 54 } 55 56 66 public static IIOImage decodeImage(byte[] imageData, String mimeType) 67 throws IllegalArgumentException , IOException { 68 return decodeImage(new ByteArrayInputStream (imageData), mimeType); 69 } 70 71 81 public static IIOImage decodeImage(InputStream imageData, String mimeType) 82 throws IllegalArgumentException , IOException { 83 Iterator imageReaders = ImageIO.getImageReadersByMIMEType(mimeType); 84 if ( imageReaders == null || !imageReaders.hasNext() ) { 85 throw new IllegalArgumentException ("Unsupported mimetype: " + mimeType); 86 } 87 ImageReader reader = (ImageReader ) imageReaders.next(); 88 ImageReadParam param = reader.getDefaultReadParam(); 89 ImageInputStream iis = ImageIO.createImageInputStream(imageData); 90 reader.setInput(iis, true, true); 91 int index = reader.getMinIndex(); 92 BufferedImage image = reader.read(index, param); 93 IIOMetadata metadata = reader.getImageMetadata(index); 94 IIOImage iioImage = new IIOImage (image, null, metadata); 95 iis.close(); 96 reader.dispose(); 97 return iioImage; 98 } 99 100 110 public static byte[] encodeImage(IIOImage image, String mimeType) 111 throws IllegalArgumentException , IOException { 112 ByteArrayOutputStream out = new ByteArrayOutputStream (); 113 encodeImage(image, out, mimeType); 114 byte[] result = out.toByteArray(); 115 out.close(); 116 return result; 117 } 118 119 129 public static void encodeImage(IIOImage image, OutputStream imageData, String mimeType) 130 throws IllegalArgumentException , IOException { 131 Iterator imageWriters = ImageIO.getImageWritersByMIMEType(mimeType); 132 if ( imageWriters == null || !imageWriters.hasNext() ) { 133 throw new IllegalArgumentException ("Unsupported mimetype: " + mimeType); 134 } 135 ImageWriter writer = (ImageWriter ) imageWriters.next(); 136 ImageWriteParam param = writer.getDefaultWriteParam(); 137 ImageOutputStream ios = ImageIO.createImageOutputStream(imageData); 138 if ( mimeType.equalsIgnoreCase(MIMETYPE_JPEG) && image.getMetadata() == null ) { 139 param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 140 param.setCompressionQuality(1.0f); 141 } 142 writer.setOutput(ios); 143 writer.write(image.getMetadata(), image, param); 144 ios.flush(); 145 writer.dispose(); 146 } 147 148 158 public static IIOImage scaleToRectangle(IIOImage iioSource, int maxWidth, int maxHeight) { 159 if ( !(iioSource.getRenderedImage() instanceof BufferedImage ) ) { 160 throw new IllegalArgumentException ("RenderedImage in IIOImage must be BufferedImage"); 161 } 162 163 BufferedImage source = (BufferedImage ) iioSource.getRenderedImage(); 164 165 double scale = 1.0d; 166 if ( maxWidth == 0 && maxHeight == 0 ) { 167 scale = 1.0d; 168 } else if ( maxWidth == 0 ) { 169 scale = (double) maxHeight / (double) source.getHeight(); 170 } else if ( maxHeight == 0 ) { 171 scale = (double) maxWidth / (double) source.getWidth(); 172 } else { 173 double scaledWidth = (double) maxWidth / (double) source.getWidth(); 174 double scaledHeight = (double) maxHeight / (double) source.getHeight(); 175 scale = Math.min(scaledHeight, scaledWidth); 176 } 177 if ( scale >= 1.0d ) { 179 return iioSource; 180 } 181 182 AffineTransform at = new AffineTransform (); 183 at.scale(scale, scale); 184 AffineTransformOp atOp = new AffineTransformOp (at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 185 BufferedImage destination = atOp.filter(source, null); 186 187 IIOImage iioDestination = new IIOImage (destination, null, null); 188 return iioDestination; 189 } 190 191 } 192 | Popular Tags |