package iiuf.jai; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.media.jai.Histogram; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; /** (c) 1999, IIUF<p> Display histogram in a panel object. @author $Author: hassan $ @version $Revision: 1.1 $ */ public class HistogramPanel extends JPanel { /** Histogram to display */ protected Histogram histogram; /** Number of bins */ protected int maxBins; /** Size of the histogram panel */ protected Dimension size; /** Colors of the bands */ protected Color[] bandColor = { Color.red, Color.green, Color.blue, Color.black }; /** Constructs the histogram panel object. @param histogram Histogram to display */ public HistogramPanel(Histogram h) { this.histogram = h; initClass(); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { int x = e.getX(); int bin = x*maxBins / size.width; int[][] bins = histogram.getBins(); int numBands = bins.length; String txt = Integer.toString(bins[0][bin]); for (int i = 1; i < numBands; i++) { txt = txt+","+bins[i][bin]; } setToolTipText("Bin: "+bin+" ["+txt+"]"); } }); } /** Initializes the internal variables. */ private void initClass() { int[] numBins = histogram.getNumBins(); int numBands = numBins.length; maxBins = 0; for (int i = 0; i < numBands; i++) { maxBins = Math.max(maxBins, numBins[i]); } setMinimumSize(new Dimension(maxBins * numBands, 100)); setPreferredSize(new Dimension(maxBins * numBands, 100)); } /** Set the color of a band. */ public void setBandColor(int b, Color c) { bandColor[b] = c; } /** Paints the histogram component. @param g graphics context */ protected void paintComponent(Graphics g) { size = getSize(null); g.clearRect(0, 0, size.width, size.height); int[][] bins = histogram.getBins(); int numBands = bins.length; int highValue = 0; for (int band = 0; band < numBands; band++) { for (int bin = 0; bin < bins[band].length; bin++) { highValue = Math.max(highValue, bins[band][bin]); } } for (int band = 0; band < numBands; band++) { g.setColor(bandColor[band]); for (int bin = 0; bin < bins[band].length; bin++) { int xpos = ((bin*numBands)+band) * size.width / (maxBins*numBands); int xpos2 = ((bin*numBands)+(band+1)) * size.width / (maxBins*numBands); int ysize = size.height * bins[band][bin] / highValue; g.fillRect(xpos, size.height-ysize, xpos2-xpos, ysize); } } } /** Main program @param argv argument (filename of image) */ public static void main(String[] argv) { // Check arguments if (argv.length != 1) { System.err.println("Usage: java iiuf.jai.HistogramPanel filename"); System.exit(1); } // Load image PlanarImage image = JAI.create("fileload", argv[0]); // Get the number of bands int bands = image.getSampleModel().getNumBands(); // Create histogram object int[] numBins = new int[bands]; double[] lowValue = new double[bands]; double[] highValue = new double[bands]; for (int band = 0; band < bands; band++) { numBins[band] = 256; lowValue[band] = 0.0; highValue[band] = 255.0; } Histogram histogram = new Histogram(numBins, lowValue, highValue); // Calculate histogram of image PlanarImage histImage = JAI.create("histogram", image, histogram); histogram = (Histogram) histImage.getProperty("histogram"); JFrame window = new JFrame(); window.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { e.getWindow().dispose(); } }); window.getContentPane().add(new HistogramPanel(histogram), BorderLayout.CENTER); window.pack(); window.show(); } }