/* * org.openmicroscopy.shoola.util.image.io.ImageWriter * *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.image.io; //Java imports import java.awt.Graphics2D; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; import java.awt.image.Raster; import java.awt.image.WritableRaster; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; //Third-party libraries //Application-internal dependencies import org.openmicroscopy.shoola.util.filter.file.GIFFilter; import org.openmicroscopy.shoola.util.filter.file.JPEGFilter; import org.openmicroscopy.shoola.util.filter.file.PNGFilter; /** * Utility class to encode images. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author <br>Andrea Falconi      * <a href="mailto:a.falconi@dundee.ac.uk"> * a.falconi@dundee.ac.uk</a> * @version 2.2 * <small> * (<b>Internal version:</b> $Revision$ $Date$) * </small> * @since OME2.2 */ public class WriterImage { /** Indicates to create a <code>JPEG</code>. */ public static final int JPEG = 0; /** Indicates to create a <code>PNG</code>. */ public static final int PNG = 1; /** Indicates to create a <code>GIF</code>. */ public static final int GIF = 2; /** * Encodes the specified image. Depending on the specified format * a <code>JPEG</code>, <code>PNG</code>, <code>BMP</code> image is created. * * @param f The file used to create the output stream. * @param img The image to encode. * @param format The file format. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static void saveImage(File f, BufferedImage img, String format) throws EncoderException { if (f == null) throw new IllegalArgumentException("No file specified."); if (img == null) throw new IllegalArgumentException("No image specified."); ImageOutputStream ios = null; try { Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(format); ImageWriter writer = writers.next(); ios = ImageIO.createImageOutputStream(f); if (ios == null) { throw new IOException("Can't access file"); } writer.setOutput(ios); writer.write(img); } catch (IOException e) { throw new EncoderException("Cannot encode the image.", e); } finally { if (ios != null) { try { ios.close(); } catch (Exception ex) {} } } } /** * Encodes the specified image. * * @param encoder The encoder to use. Mustn't be <code>null</code>. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static void saveImage(Encoder encoder) throws EncoderException { if (encoder == null) throw new IllegalArgumentException("No encoder specified."); try { encoder.write(); encoder.getOutput().close(); } catch (Exception e) { throw new EncoderException("Cannot encode the image.", e); } } /** * Converts the BufferImage to <code>JPEG</code> image. * * @param image The image to convert. * @return See above. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static byte[] imageToByteStream(BufferedImage image) throws EncoderException { return imageToByteStream(image, JPEG); } /** * Converts the BufferImage. * * @param image The image to convert. * @param type One of the constants defined by this class. * @return See above. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static byte[] imageToByteStream(BufferedImage image, int type) throws EncoderException { if (image == null) throw new IllegalArgumentException("No image specified."); ByteArrayOutputStream stream = null; try { stream = new ByteArrayOutputStream(); switch (type) { case PNG: ImageIO.write(image, PNGFilter.PNG, stream); break; case GIF: ImageIO.write(image, GIFFilter.GIF, stream); break; case JPEG: default: ImageIO.write(image, JPEGFilter.JPEG, stream); } return stream.toByteArray(); } catch (Throwable e) { throw new EncoderException("Cannot encode the image.", e); } finally { if (stream != null) { try { stream.close(); } catch (Exception ex) {} } } } /** * Converts the passed byte array to a buffered image. * * @param values The values to convert. * @return See above. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static BufferedImage bytesToImage(byte[] values) throws EncoderException { if (values == null) throw new IllegalArgumentException("No array specified."); ByteArrayInputStream stream = null; try { stream = new ByteArrayInputStream(values); BufferedImage image = ImageIO.read(stream); if (image != null) image.setAccelerationPriority(1f); return image; } catch (Exception e) { throw new EncoderException("Cannot create buffered image", e); } finally { if (stream != null) { try { stream.close(); } catch (Exception ex) {} } } } /** * Converts the passed byte array to a byte array used to texture. * * @param values The values to convert. * @return See above. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static byte[] bytesToBytes(byte[] values) throws EncoderException { if (values == null) throw new IllegalArgumentException("No array specified."); ByteArrayInputStream stream = null; try { stream = new ByteArrayInputStream(values); BufferedImage image = ImageIO.read(stream); if (image == null) return null; image.setAccelerationPriority(1f); int w = image.getWidth(); int h = image.getHeight(); WritableRaster raster = Raster.createInterleavedRaster( DataBuffer.TYPE_BYTE, w, h, 4, null); ComponentColorModel cm = new ComponentColorModel (ColorSpace.getInstance( ColorSpace.CS_sRGB), new int[] {8, 8, 8, 8}, true, false, ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE); BufferedImage img = new BufferedImage(cm, raster, false, null); Graphics2D g = img.createGraphics(); g.drawImage(image, null, null); DataBufferByte buf = (DataBufferByte) raster.getDataBuffer(); return buf.getData(); } catch (Exception e) { throw new EncoderException("Cannot create buffered image", e); } finally { if (stream != null) { try { stream.close(); } catch (Exception ex) {} } } } /** * Converts the passed byte array to a buffered image. * * @param values The values to convert. * @return See above. * @throws EncoderException Exception thrown if an error occurred during the * encoding process. */ public static int[] bytesToDataBuffer(byte[] values) throws EncoderException { if (values == null) throw new IllegalArgumentException("No array specified."); try { BufferedImage img = bytesToImage(values); if (img == null) return null; DataBufferInt buf = (DataBufferInt) img.getData().getDataBuffer(); return buf.getData(); } catch (Exception e) { throw new EncoderException("Cannot decode the image.", e); } } }