/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.vfny.geoserver.wms.responses.map.tiff; import java.awt.image.RenderedImage; import java.io.IOException; import java.io.OutputStream; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.spi.ImageWriterSpi; import javax.imageio.stream.ImageOutputStream; import org.geoserver.wms.WMS; import org.vfny.geoserver.wms.GetMapProducer; import org.vfny.geoserver.wms.WmsException; import org.vfny.geoserver.wms.responses.DefaultRasterMapProducer; import com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi; /** * Map producer for producing Tiff images out of a map. * * @author Simone Giannecchini * @since 1.4.x * */ public final class TiffMapProducer extends DefaultRasterMapProducer { /** A logger for this class. */ private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.vfny.geoserver.responses.wms.map"); private final static ImageWriterSpi writerSPI = new TIFFImageWriterSpi(); /** the only MIME type this map producer supports */ static final String MIME_TYPE = "image/tiff"; private static final String[] OUTPUT_FORMATS = {MIME_TYPE, "image/tiff8" }; /** * Creates a {@link GetMapProducer} to encode the {@link RenderedImage} * generated in <code>outputFormat</code> format. * * @param outputFormat * the output format. */ public TiffMapProducer(WMS wms) { super(MIME_TYPE, OUTPUT_FORMATS, wms); } /** * Transforms the rendered image into the appropriate format, streaming to * the output stream. * * @param format * The name of the format * @param image * The image to be formatted. * @param outStream * The stream to write to. * * @throws WmsException * not really. * @throws IOException * if the image writing fails. */ public void formatImageOutputStream(RenderedImage image, OutputStream outStream) throws WmsException, IOException { // getting a writer if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Getting a writer for tiff"); } // get a writer final ImageWriter writer = writerSPI.createWriterInstance(); // getting a stream caching in memory final ImageOutputStream ioutstream = ImageIO .createImageOutputStream(outStream); // tiff if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Writing tiff image ..."); } // get the one required by the GetMapRequest final String format = getOutputFormat(); // do we want it to be 8 bits? if (format.equalsIgnoreCase("image/tiff8") || (this.mapContext.getPaletteInverter() != null)) { image = forceIndexed8Bitmask(image); } // write it out writer.setOutput(ioutstream); writer.write(image); ioutstream.close(); writer.dispose(); if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Writing tiff image done!"); } } public String getContentDisposition() { // can be null return null; } }