/* * GeoTools - OpenSource mapping toolkit * http://geotools.org * (C) 2007, GeoTools Project Managment Committee (PMC) * * 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.geotools.renderedimage.viewer; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.DataBuffer; import java.awt.image.RenderedImage; import javax.media.jai.iterator.RandomIter; import javax.media.jai.iterator.RandomIterFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToggleButton; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * Simple rendered image browser, allows to zoom in, out, display tile grid and * view pixel values on mouse over * * @author Andrea Aime * @author Daniele Romagnoli, GeoSolutions SAS * @author Simone Giannecchini, GeoSolutions SAS * * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/library/render/src/main/java/org/geotools/renderedimage/viewer/ImageViewer.java $ */ public class ImageViewer extends JPanel { private ZoomableImageDisplay display; private ImageViewer relatedViewer; private JLabel status; private RandomIter pixelIter; private int[] ipixel; private double[] dpixel; private int dataType; private StringBuffer sb = new StringBuffer(); private RenderedImage image; public ImageViewer(ImageViewer relatedViewer) { this(); this.relatedViewer = relatedViewer; } public ImageViewer() { setLayout(new BorderLayout()); // build the button bar JButton zoomIn = new JButton("Zoom in"); JButton zoomOut = new JButton("Zoom out"); final JToggleButton tileGrid = new JToggleButton("Tile grid"); JPanel buttonBar = new JPanel(); buttonBar.setLayout(new FlowLayout(FlowLayout.LEFT)); buttonBar.add(zoomIn); buttonBar.add(zoomOut); buttonBar.add(tileGrid); // actual image viewer display = new ZoomableImageDisplay(); // display.setBackground(Color.BLACK); tileGrid.setSelected(display.isTileGridVisible()); // the "status bar" status = new JLabel("Move on the image to display pixel values... "); // compose add(buttonBar, BorderLayout.NORTH); add(new JScrollPane(display), BorderLayout.CENTER); add(status, BorderLayout.SOUTH); // events zoomIn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display.setScale(display.getScale() * 2.0); if (relatedViewer != null){ relatedViewer.display.setScale(relatedViewer.display.getScale() * 2.0); } } }); zoomOut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display.setScale(display.getScale() / 2.0); if (relatedViewer != null){ relatedViewer.display.setScale(relatedViewer.display.getScale() / 2.0); } } }); tileGrid.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { display.setTileGridVisible(tileGrid.isSelected()); if (relatedViewer != null){ relatedViewer.display.setTileGridVisible(tileGrid.isSelected()); } } }); display.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { if(pixelIter != null) { int x = (int) Math.round(e.getX() / display.getScale()); int y = (int) Math.round(e.getY() / display.getScale()); sb.setLength(0); if(x < image.getMinX() || x >= image.getMinX() + image.getWidth() || y < image.getMinY() || y >= image.getMinY() + image.getHeight()) { sb.append("Outside of image bounds"); } else { sb.append("Value at "); sb.append(x).append(", ").append(y).append(": ["); if(dataType == DataBuffer.TYPE_DOUBLE || dataType == DataBuffer.TYPE_FLOAT) { pixelIter.getPixel(x, y, dpixel); for (int i = 0; i < dpixel.length; i++) { sb.append(dpixel[i]); if(i < dpixel.length - 1) sb.append(", "); } } else { // integer samples pixelIter.getPixel(x, y, ipixel); for (int i = 0; i < ipixel.length; i++) { sb.append(ipixel[i]); if(i < ipixel.length - 1) sb.append(", "); } } sb.append("]"); } status.setText(sb.toString()); } } }); } public void setImage(RenderedImage image) { this.image = image; display.setImage(image); pixelIter = RandomIterFactory.create(image, null); ipixel = new int[image.getSampleModel().getNumBands()]; dpixel = new double[image.getSampleModel().getNumBands()]; } public ImageViewer getRelatedViewer() { return relatedViewer; } public void setRelatedViewer(ImageViewer relatedViewer) { this.relatedViewer = relatedViewer; } }