/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2013, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotoolkit.coverage.wkb;
import java.awt.geom.AffineTransform;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.nio.file.Path;
import java.util.Locale;
import javax.imageio.IIOImage;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.stream.ImageOutputStream;
import org.apache.sis.util.ArraysExt;
import org.geotoolkit.image.io.metadata.SpatialMetadata;
import org.geotoolkit.nio.IOUtilities;
import org.geotoolkit.util.Utilities;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class WKBRasterImageWriter extends ImageWriter{
public WKBRasterImageWriter(ImageWriterSpi spi){
super(spi);
}
@Override
public IIOMetadata getDefaultStreamMetadata(ImageWriteParam param) {
return new SpatialMetadata(true, this, null);
}
@Override
public IIOMetadata getDefaultImageMetadata(ImageTypeSpecifier imageType, ImageWriteParam param) {
return new SpatialMetadata(false, this, null);
}
@Override
public IIOMetadata convertStreamMetadata(IIOMetadata inData, ImageWriteParam param) {
return new SpatialMetadata(true, this, null);
}
@Override
public IIOMetadata convertImageMetadata(IIOMetadata inData, ImageTypeSpecifier imageType, ImageWriteParam param) {
return new SpatialMetadata(false, this, null);
}
@Override
public boolean canWriteRasters() {
return true;
}
@Override
public void write(IIOImage image) throws IOException {
final Raster ri = image.getRaster();
final WKBRasterWriter writer = new WKBRasterWriter();
final Object out = getOutput();
if(out instanceof ImageOutputStream){
final ImageOutputStream stream = (ImageOutputStream) out;
final byte[] data = writer.write(ri, new AffineTransform(), 0);
stream.write(data);
}else{
final OutputStream stream = IOUtilities.openWrite(getOutput());
writer.write(ri, new AffineTransform(), 0, stream);
stream.flush();
stream.close();
}
}
@Override
public void write(IIOMetadata streamMetadata, IIOImage image, ImageWriteParam param) throws IOException {
final RenderedImage ri = image.getRenderedImage();
final WKBRasterWriter writer = new WKBRasterWriter();
final Object out = getOutput();
if(out instanceof ImageOutputStream){
final ImageOutputStream stream = (ImageOutputStream) out;
final byte[] data = writer.write(ri, new AffineTransform(), 0);
stream.write(data);
}else{
final OutputStream stream = IOUtilities.openWrite(getOutput());
writer.write(ri, new AffineTransform(), 0, stream);
stream.flush();
stream.close();
}
}
public static class Spi extends ImageWriterSpi {
public Spi() {
super();
names = new String[] {"PostGISWKBraster"};
MIMETypes = new String[] {"image/x-pgraster"};
pluginClassName = "org.geotoolkit.coverage.wkb.WKBRasterImageWriter";
vendorName = "Geotoolkit.org";
version = Utilities.VERSION.toString();
readerSpiNames = new String[] {"PostGISWKBraster"};
outputTypes = new Class[0];
outputTypes = ArraysExt.append(outputTypes, OutputStream.class);
outputTypes = ArraysExt.append(outputTypes, File.class);
outputTypes = ArraysExt.append(outputTypes, URL.class);
outputTypes = ArraysExt.append(outputTypes, URI.class);
outputTypes = ArraysExt.append(outputTypes, Path.class);
outputTypes = ArraysExt.append(outputTypes, ImageOutputStream.class);
suffixes = new String[0];
suffixes = ArraysExt.append(suffixes, "wkb");
}
@Override
public String getDescription(Locale locale) {
return "Postgis WKB Raster writer.";
}
@Override
public boolean canEncodeImage(ImageTypeSpecifier type) {
return true;
}
@Override
public ImageWriter createWriterInstance(Object extension) throws IOException {
return new WKBRasterImageWriter(this);
}
}
}