Revision: 6033 http://sourceforge.net/p/jump-pilot/code/6033 Author: ma15569 Date: 2018-12-24 06:53:13 +0000 (Mon, 24 Dec 2018) Log Message: ----------- Added some method to make an affine transformation on image files loaded as ReferencedImageLayer.class and as RasterImageLayer.class
Modified Paths: -------------- core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/imagery/ImageryUtils.java Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/imagery/ImageryUtils.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/imagery/ImageryUtils.java 2018-12-23 12:14:31 UTC (rev 6032) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/imagery/ImageryUtils.java 2018-12-24 06:53:13 UTC (rev 6033) @@ -13,24 +13,45 @@ import javax.imageio.IIOImage; import javax.imageio.ImageIO; +import javax.imageio.ImageReader; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; +import javax.imageio.stream.FileImageInputStream; import javax.imageio.stream.ImageOutputStream; +import javax.media.jai.InterpolationNearest; import javax.media.jai.JAI; +import javax.media.jai.PerspectiveTransform; import javax.media.jai.RenderedOp; +import javax.media.jai.WarpPerspective; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import org.openjump.core.apitools.IOTools; import org.openjump.core.rasterimage.GridAscii; import org.openjump.core.rasterimage.GridFloat; +import org.openjump.core.rasterimage.RasterImageLayer; +import org.openjump.core.ui.io.file.FileNameExtensionFilter; +import org.openjump.core.ui.plugin.file.open.JFCWithEnterAction; import com.sun.media.jai.codec.FileSeekableStream; import com.sun.media.jai.codec.TIFFDecodeParam; +import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.util.AffineTransformation; +import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; +import com.vividsolutions.jump.workbench.JUMPWorkbench; +import com.vividsolutions.jump.workbench.WorkbenchContext; +import com.vividsolutions.jump.workbench.datasource.SaveFileDataSourceQueryChooser; import com.vividsolutions.jump.workbench.imagery.ImageryLayerDataset; import com.vividsolutions.jump.workbench.imagery.ReferencedImageException; import com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster; import com.vividsolutions.jump.workbench.model.Layer; +import com.vividsolutions.jump.workbench.ui.GUIUtil; +import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn; public class ImageryUtils { @@ -39,7 +60,7 @@ /** * Save to Tiff - * + * @deprecated see IOTools.saveGeoTIFF(BufferedImage bufferedImage, Envelope envelope, File tiffFile) * @param tiffFile * : ex. C:/Folder/file.tif * @param bufferedImage @@ -46,12 +67,13 @@ * : BufferedImage from a layer * @return */ + @Deprecated public static boolean saveToTiff(File tiffFile, BufferedImage bufferedImage) { ImageOutputStream ios = null; ImageWriter writer = null; try { // find an appropriate writer - Iterator it = ImageIO.getImageWritersByFormatName("TIF"); + final Iterator it = ImageIO.getImageWritersByFormatName("TIF"); if (it.hasNext()) { writer = (ImageWriter) it.next(); } else { @@ -60,16 +82,16 @@ // setup writer ios = ImageIO.createImageOutputStream(tiffFile); writer.setOutput(ios); - ImageWriteParam writeParam = new ImageWriteParam( + final ImageWriteParam writeParam = new ImageWriteParam( Locale.ENGLISH); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); writeParam.setCompressionType("LZW"); // convert to an IIOImage - IIOImage iioImage = new IIOImage(bufferedImage, null, null); + final IIOImage iioImage = new IIOImage(bufferedImage, null, null); writer.write(null, iioImage, writeParam); - } catch (IOException e) { + } catch (final IOException e) { e.printStackTrace(); return false; } @@ -91,7 +113,7 @@ try { ImageIO.write(image, "png", pngFile); - } catch (IOException e) { + } catch (final IOException e) { e.printStackTrace(); return false; } @@ -106,10 +128,10 @@ */ public static boolean hasBeenModified(Layer layer) { - FeatureCollection featureCollection = layer + final FeatureCollection featureCollection = layer .getFeatureCollectionWrapper(); - for (Iterator i = featureCollection.iterator(); i.hasNext();) { - Feature feature = (Feature) i.next(); + for (final Iterator i = featureCollection.iterator(); i.hasNext();) { + final Feature feature = (Feature) i.next(); sourcePathImage = feature.getString(ImageryLayerDataset.ATTR_URI); if (sourcePathImage == null || sourcePathImage.length() < 5) { sourcePathImage = ""; @@ -123,14 +145,14 @@ GeoReferencedRaster geoRaster = null; try { geoRaster = new GeoReferencedRaster(fileNameOrURL); - } catch (ReferencedImageException e) { + } catch (final ReferencedImageException e) { // TODO Auto-generated catch block e.printStackTrace(); } - Envelope originalEnv = geoRaster.getOriginalEnvelope(); + final Envelope originalEnv = geoRaster.getOriginalEnvelope(); - Envelope targetEnv = geoRaster.getEnvelope(); + final Envelope targetEnv = geoRaster.getEnvelope(); // targetEnv.expandToInclude(layer.getFeatureCollectionWrapper() // .getEnvelope()); @@ -149,10 +171,10 @@ */ public static boolean isCompatibleImageLayer(Layer layer) { - FeatureCollection featureCollection = layer + final FeatureCollection featureCollection = layer .getFeatureCollectionWrapper(); - for (Iterator i = featureCollection.iterator(); i.hasNext();) { - Feature feature = (Feature) i.next(); + for (final Iterator i = featureCollection.iterator(); i.hasNext();) { + final Feature feature = (Feature) i.next(); sourcePathImage = feature.getString(ImageryLayerDataset.ATTR_URI); if (sourcePathImage == null || sourcePathImage.length() < 5) { sourcePathImage = ""; @@ -185,13 +207,48 @@ * @throws IOException */ + public static BufferedImage getBufferFromReferenceImageLayer2(Layer layer) + throws IOException { + + final FeatureCollection featureCollection = layer + .getFeatureCollectionWrapper(); + for (final Iterator<Feature> i = featureCollection.iterator(); i + .hasNext();) { + final Feature feature = i.next(); + sourcePathImage = feature.getString(ImageryLayerDataset.ATTR_URI); + if (sourcePathImage == null || sourcePathImage.length() < 5) { + sourcePathImage = ""; + } else { + sourcePathImage = sourcePathImage.substring(5); + } + + } + fileNameOrURL = sourcePathImage.replace("%20", " "); + BufferedImage bImage = null; + final FileImageInputStream is = new FileImageInputStream(new File( + fileNameOrURL)); + final ImageReader reader = ImageIO.getImageReaders(is).next(); + reader.setInput(is); + bImage = reader.read(0); + return bImage; + + } + + /** + * Get a bufferedImage from a ReferencedImage layer + * + * @param layer + * @return + * @throws IOException + */ + public static BufferedImage getBufferFromReferenceImageLayer(Layer layer) throws IOException { - FeatureCollection featureCollection = layer + final FeatureCollection featureCollection = layer .getFeatureCollectionWrapper(); - for (Iterator i = featureCollection.iterator(); i.hasNext();) { - Feature feature = (Feature) i.next(); + for (final Iterator i = featureCollection.iterator(); i.hasNext();) { + final Feature feature = (Feature) i.next(); sourcePathImage = feature.getString(ImageryLayerDataset.ATTR_URI); if (sourcePathImage == null || sourcePathImage.length() < 5) { sourcePathImage = ""; @@ -211,7 +268,7 @@ try { // Try with ImageIO bImage = ImageIO.read(new File(fileNameOrURL)); - } catch (Exception ex) { + } catch (final Exception ex) { // Try with JAI bImage = JAI.create("fileload", fileNameOrURL) .getAsBufferedImage(); @@ -222,23 +279,23 @@ try { bImage = ImageIO.read(new File(fileNameOrURL)); - } catch (Exception ex) { + } catch (final Exception ex) { - FileSeekableStream stream = new FileSeekableStream( + final FileSeekableStream stream = new FileSeekableStream( fileNameOrURL); - TIFFDecodeParam decodeParam = new TIFFDecodeParam(); + final TIFFDecodeParam decodeParam = new TIFFDecodeParam(); decodeParam.setDecodePaletteAsShorts(true); - ParameterBlock params = new ParameterBlock(); + final ParameterBlock params = new ParameterBlock(); params.add(stream); - RenderedOp image1 = JAI.create("tiff", params); + final RenderedOp image1 = JAI.create("tiff", params); bImage = image1.getAsBufferedImage(); } } else if (fileNameOrURL.toLowerCase().endsWith(".flt")) { try { - GridFloat gf = new GridFloat(fileNameOrURL); + final GridFloat gf = new GridFloat(fileNameOrURL); gf.readGrid(null); bImage = gf.getBufferedImage(); - } catch (Exception ex) { + } catch (final Exception ex) { // Try with ImageIO bImage = ImageIO.read(new File(fileNameOrURL)); } @@ -245,10 +302,10 @@ } else if (fileNameOrURL.toLowerCase().endsWith(".asc") || fileNameOrURL.toLowerCase().endsWith(".txt")) { try { - GridAscii ga = new GridAscii(fileNameOrURL); + final GridAscii ga = new GridAscii(fileNameOrURL); ga.readGrid(null); bImage = ga.getBufferedImage(); - } catch (Exception ex) { + } catch (final Exception ex) { // Try with ImageIO bImage = ImageIO.read(new File(fileNameOrURL)); } @@ -258,7 +315,7 @@ try { // ECWImage ecw = new ECWImage(fileNameOrURL); bImage = ImageIO.read(new File(fileNameOrURL)); - } catch (Exception ex) { + } catch (final Exception ex) { // Try with ImageIO bImage = ImageIO.read(new File(fileNameOrURL)); } @@ -275,10 +332,11 @@ */ public static BufferedImage addAlphaChannel(BufferedImage image) { - BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), - image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + final BufferedImage bufferedImage = new BufferedImage( + image.getWidth(null), image.getHeight(null), + BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = bufferedImage.createGraphics(); + final Graphics2D g2 = bufferedImage.createGraphics(); g2.drawImage(image, 0, 0, null); g2.dispose(); return bufferedImage; @@ -285,7 +343,7 @@ } /** - * + * Resize image * @param originalImage * @param width * @param height @@ -293,9 +351,9 @@ */ public static BufferedImage resizeImage(BufferedImage bufferedImage, int width, int height) { - BufferedImage resizedImage = new BufferedImage(width, height, + final BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = resizedImage.createGraphics(); + final Graphics2D g = resizedImage.createGraphics(); // g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.drawImage(bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); @@ -307,9 +365,9 @@ public static BufferedImage resizeImage_test(BufferedImage bufferedImage, int width, int height) { - BufferedImage resizedImage = new BufferedImage(width, height, + final BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = resizedImage.createGraphics(); + final Graphics2D g = resizedImage.createGraphics(); g.drawImage(bufferedImage, 0, 0, width, height, null); g.setComposite(AlphaComposite.Src); @@ -323,4 +381,238 @@ return resizedImage; } + private static final String FILE_CHOOSER_DIRECTORY_KEY = SaveFileDataSourceQueryChooser.class + .getName() + " - FILE CHOOSER DIRECTORY"; + private final static JFCWithEnterAction fileChooser = new GUIUtil.FileChooserWithOverwritePrompting(); + private final static FileNameExtensionFilter filter = new FileNameExtensionFilter( + "GeoTIFF", "tif"); + private static final String SAVE = I18N + .get("jump.plugin.edit.AffineTransformationPlugIn.save"); + private static final String ALLOWED_IMAGES = I18N + .get("jump.plugin.edit.AffineTransformationPlugIn.allowed-files"); + static WorkbenchContext wcontex = JUMPWorkbench.getInstance().getContext(); + + /** + * Affine transformation of an image file loaded as ReferencedImageLayer.class + * @param Layer. (as ReferencedImageLayer.class) + * @param AffineTransformation. com.vividsolutions.jts.geom.util.AffineTransformation + * @param resizeImageToHalf. Resize image to half dimension + * @throws Exception + */ + public static void affineTransformation(Layer layer, + AffineTransformation trans, boolean resizeImageToHalf) + throws Exception { + try { + + fileChooser.setDialogTitle(SAVE); + fileChooser.setFileFilter(filter); + fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); + fileChooser.addChoosableFileFilter(filter); + if (PersistentBlackboardPlugIn.get(wcontex).get( + FILE_CHOOSER_DIRECTORY_KEY) != null) { + fileChooser.setCurrentDirectory(new File( + (String) PersistentBlackboardPlugIn.get(wcontex).get( + FILE_CHOOSER_DIRECTORY_KEY))); + } + // File outFile = null; + File outFile = null; + int option; + option = fileChooser.showSaveDialog(wcontex.getWorkbench() + .getFrame()); + if (option == JFileChooser.APPROVE_OPTION) { + outFile = fileChooser.getSelectedFile(); + final String filePath = outFile.getAbsolutePath(); + // outFile = new File(filePath + ".png"); + outFile = new File(filePath + ".tif"); + + final Envelope inEnvelope = new Envelope(); + // Get the bufferedImage from a ReferencedImage layer + BufferedImage InImageBuffer = getBufferFromReferenceImageLayer2(layer); + // Ad alpha chanel + InImageBuffer = ImageryUtils.addAlphaChannel(InImageBuffer); + if (resizeImageToHalf) { + InImageBuffer = ImageryUtils.resizeImage(InImageBuffer, + InImageBuffer.getWidth() / 2, + InImageBuffer.getHeight() / 2); + } + inEnvelope.expandToInclude(layer.getFeatureCollectionWrapper() + .getEnvelope()); + final Geometry P0 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMinX(), + inEnvelope.getMinY())); + final Geometry P1 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMaxX(), + inEnvelope.getMinY())); + final Geometry P2 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMaxX(), + inEnvelope.getMaxY())); + final Geometry P3 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMinX(), + inEnvelope.getMaxY())); + + final Geometry P0_ = trans.transform(P0); + final Geometry P1_ = trans.transform(P1); + final Geometry P2_ = trans.transform(P2); + final Geometry P3_ = trans.transform(P3); + // Apply transformation from source points to target points + // To use for the image buffer + final WarpPerspective warp = new WarpPerspective( + PerspectiveTransform.getQuadToQuad( + P0.getCoordinate().x, P0.getCoordinate().y, + P1.getCoordinate().x, P1.getCoordinate().y, + P2.getCoordinate().x, P2.getCoordinate().y, + P3.getCoordinate().x, P3.getCoordinate().y, + P0_.getCoordinate().x, P0_.getCoordinate().y, + P1_.getCoordinate().x, P1_.getCoordinate().y, + P2_.getCoordinate().x, P2_.getCoordinate().y, + P3_.getCoordinate().x, P3_.getCoordinate().y)); + // Apply transformation to the image buffer + // outImageBuffer to use for transformed Image + + final ParameterBlock pb = new ParameterBlock(); + pb.addSource(InImageBuffer); + pb.add(warp); + pb.add(new InterpolationNearest()); + final RenderedOp outputOp = JAI.create("warp", pb); + final BufferedImage outImageBuffer = outputOp + .getAsBufferedImage(); + + // final Raster outRaster = outputOp.getData(null); + final GeometryFactory gf = new GeometryFactory(); + final Geometry outGeometry = trans.transform(gf + .toGeometry(inEnvelope)); + // Get Envelope from out Geometry + // outoutEnvelope to use for transformed Image + final Envelope outEnvelope = outGeometry.getEnvelope() + .getEnvelopeInternal(); + // Set input raster layer to invisible + layer.setVisible(false); + outputOp.dispose(); + // Save output (affined transformed) image GeoTIF file + IOTools.saveGeoTIFF(outImageBuffer, outEnvelope, outFile); + + IOTools.loadImageAsLayer(outFile, wcontex, "tif"); + } else if (option == JFileChooser.CANCEL_OPTION) { + + return; + } + + } catch (final RuntimeException localRuntimeException) { + JOptionPane.showMessageDialog(null, ALLOWED_IMAGES, null, + JOptionPane.INFORMATION_MESSAGE); + } + } + + /** + * Affine transformation of an image file loaded as RasterImageLaye.class + * @param RasterImageLayer. + * @param AffineTransformation. com.vividsolutions.jts.geom.util.AffineTransformation + * @param resizeImageToHalf. Resize image to half dimension + * @throws Exception + */ + + public static void affineTransformation(RasterImageLayer layer, + AffineTransformation trans, boolean resizeImageToHalf) + throws Exception { + try { + + fileChooser.setDialogTitle(SAVE); + fileChooser.setFileFilter(filter); + fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); + fileChooser.addChoosableFileFilter(filter); + if (PersistentBlackboardPlugIn.get(wcontex).get( + FILE_CHOOSER_DIRECTORY_KEY) != null) { + fileChooser.setCurrentDirectory(new File( + (String) PersistentBlackboardPlugIn.get(wcontex).get( + FILE_CHOOSER_DIRECTORY_KEY))); + } + // File outFile = null; + File outFile = null; + int option; + option = fileChooser.showSaveDialog(wcontex.getWorkbench() + .getFrame()); + if (option == JFileChooser.APPROVE_OPTION) { + outFile = fileChooser.getSelectedFile(); + final String filePath = outFile.getAbsolutePath(); + // outFile = new File(filePath + ".png"); + outFile = new File(filePath + ".tif"); + + final Envelope inEnvelope = new Envelope(); + // Get the bufferedImage from a ReferencedImage layer + BufferedImage InImageBuffer = layer.getImage(); + // Ad alpha chanel + InImageBuffer = ImageryUtils.addAlphaChannel(InImageBuffer); + if (resizeImageToHalf) { + InImageBuffer = ImageryUtils.resizeImage(InImageBuffer, + InImageBuffer.getWidth() / 2, + InImageBuffer.getHeight() / 2); + } + inEnvelope.expandToInclude(layer.getWholeImageEnvelope()); + final Geometry P0 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMinX(), + inEnvelope.getMinY())); + final Geometry P1 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMaxX(), + inEnvelope.getMinY())); + final Geometry P2 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMaxX(), + inEnvelope.getMaxY())); + final Geometry P3 = new GeometryFactory() + .createPoint(new Coordinate(inEnvelope.getMinX(), + inEnvelope.getMaxY())); + + final Geometry P0_ = trans.transform(P0); + final Geometry P1_ = trans.transform(P1); + final Geometry P2_ = trans.transform(P2); + final Geometry P3_ = trans.transform(P3); + // Apply transformation from source points to target points + // To use for the image buffer + final WarpPerspective warp = new WarpPerspective( + PerspectiveTransform.getQuadToQuad( + P0.getCoordinate().x, P0.getCoordinate().y, + P1.getCoordinate().x, P1.getCoordinate().y, + P2.getCoordinate().x, P2.getCoordinate().y, + P3.getCoordinate().x, P3.getCoordinate().y, + P0_.getCoordinate().x, P0_.getCoordinate().y, + P1_.getCoordinate().x, P1_.getCoordinate().y, + P2_.getCoordinate().x, P2_.getCoordinate().y, + P3_.getCoordinate().x, P3_.getCoordinate().y)); + // Apply transformation to the image buffer + // outImageBuffer to use for transformed Image + + final ParameterBlock pb = new ParameterBlock(); + pb.addSource(InImageBuffer); + pb.add(warp); + pb.add(new InterpolationNearest()); + final RenderedOp outputOp = JAI.create("warp", pb); + final BufferedImage outImageBuffer = outputOp + .getAsBufferedImage(); + + // final Raster outRaster = outputOp.getData(null); + final GeometryFactory gf = new GeometryFactory(); + final Geometry outGeometry = trans.transform(gf + .toGeometry(inEnvelope)); + // Get Envelope from out Geometry + // outoutEnvelope to use for transformed Image + final Envelope outEnvelope = outGeometry.getEnvelope() + .getEnvelopeInternal(); + // Set input raster layer to invisible + layer.setVisible(false); + outputOp.dispose(); + // Save output (affined transformed) image GeoTIF file + + IOTools.saveGeoTIFF(outImageBuffer, outEnvelope, outFile); + + IOTools.loadImageAsLayer(outFile, wcontex, "tif"); + } else if (option == JFileChooser.CANCEL_OPTION) { + + return; + } + + } catch (final RuntimeException localRuntimeException) { + JOptionPane.showMessageDialog(null, ALLOWED_IMAGES, null, + JOptionPane.INFORMATION_MESSAGE); + } + } + } _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel