// License: GPL. For details, see LICENSE file.
package cadastre_fr;
import static org.openstreetmap.josm.tools.I18n.marktr;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.gce.geotiff.GeoTiffFormat;
import org.geotools.gce.geotiff.GeoTiffWriteParams;
import org.geotools.gce.geotiff.GeoTiffWriter;
import org.geotools.geometry.Envelope2D;
import org.geotools.referencing.CRS;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValueGroup;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
public class MenuActionSaveRasterAs extends JosmAction {
public static final String NAME = marktr("Save image as...");
private static final long serialVersionUID = 1L;
private WMSLayer wmsLayer;
public class FiltrePng extends FileFilter {
@Override
public boolean accept(File file) {
if (file.isDirectory()) {
return true;
}
return file.getName().toLowerCase(Locale.ENGLISH).endsWith(".png");
}
@Override
public String getDescription() {
return tr("PNG files (*.png)");
}
}
public class FiltreTiff extends FileFilter {
@Override
public boolean accept(File file) {
if (file.isDirectory()) {
return true;
}
return file.getName().toLowerCase(Locale.ENGLISH).endsWith(".tif");
}
@Override
public String getDescription() {
return tr("GeoTiff files (*.tif)");
}
}
FiltreTiff filtreTiff = new FiltreTiff();
FiltrePng filtrePng = new FiltrePng();
/**
* Constructs a new {@code MenuActionSaveRasterAs}.
* @param wmsLayer WMS layer
*/
public MenuActionSaveRasterAs(WMSLayer wmsLayer) {
super(tr(NAME), "save", tr("Export image (only raster images)"), null, false);
this.wmsLayer = wmsLayer;
}
@Override
public void actionPerformed(ActionEvent arg0) {
File file;
JFileChooser fc = new JFileChooser();
fc.addChoosableFileFilter(filtreTiff);
fc.addChoosableFileFilter(filtrePng);
fc.setFileFilter(filtreTiff);
int returnVal = fc.showSaveDialog(Main.parent);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
BufferedImage bi = wmsLayer.getImage(0).image;
if (fc.getFileFilter().equals(filtrePng)) {
if (!file.getName().endsWith(".png"))
file = new File(file.getParent(), file.getName()+".png");
try {
ImageIO.write(bi, "png", file);
/*
FileOutputStream flux = new FileOutputStream(file);
BufferedOutputStream fluxBuf = new BufferedOutputStream(flux);
JPEGImageEncoder codec = JPEGCodec.createJPEGEncoder(fluxBuf, JPEGCodec.getDefaultJPEGEncodeParam(bi));
codec.encode(bi);
fluxBuf.close();
*/
} catch (IOException e) {
e.printStackTrace();
}
} else if (fc.getFileFilter().equals(filtreTiff)) {
boolean alpha = bi.getColorModel().hasAlpha();
Main.info("image with alpha channel : " + alpha);
try {
double x = wmsLayer.getImage(0).min.east();
double y = wmsLayer.getImage(0).min.north();
Envelope2D bbox = new Envelope2D(CRS.decode("EPSG:27561"),
x, y,
wmsLayer.getImage(0).max.east()-x, wmsLayer.getImage(0).max.north()-y);
GridCoverageFactory factory = new GridCoverageFactory();
GridCoverage2D coverage = factory.create("tiff", bi, bbox);
final File output = new File(file.getParent(), file.getName()+".tif");
GeoTiffWriter gtwriter = new GeoTiffWriter(output);
GeoTiffWriteParams wp = new GeoTiffWriteParams();
wp.setCompressionMode(GeoTiffWriteParams.MODE_EXPLICIT);
wp.setCompressionType("LZW");
wp.setCompressionQuality(0.75F);
final GeoTiffFormat format = new GeoTiffFormat();
final ParameterValueGroup params = format.getWriteParameters();
params.parameter(
AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.getName().toString())
.setValue(wp);
gtwriter.write(coverage, params.values().toArray(new GeneralParameterValue[1]));
gtwriter.dispose();
coverage.dispose(true);
} catch (Exception e) {
Main.error(e);
}
}
}
}
}