Java tutorial
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BandCombineOp; import java.awt.image.BufferedImage; import java.awt.image.Raster; import java.awt.image.WritableRaster; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.TitledBorder; public class CombineApp extends JFrame { CombinePanel displayPanel; JButton redBandButton, greenBandButton, blueBandButton, inverseBandButton, middleBandButton, resetButton; public CombineApp() { super("TBandCombineOp"); Container container = getContentPane(); displayPanel = new CombinePanel(); container.add(displayPanel); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(3, 2)); panel.setBorder(new TitledBorder("Click a Button to Perform the Associated Operation and Reset...")); redBandButton = new JButton("Show Red Band"); redBandButton.addActionListener(new ButtonListener()); greenBandButton = new JButton("Show Green Band"); greenBandButton.addActionListener(new ButtonListener()); blueBandButton = new JButton("Show Blue Band"); blueBandButton.addActionListener(new ButtonListener()); inverseBandButton = new JButton("Invert All Bands"); inverseBandButton.addActionListener(new ButtonListener()); middleBandButton = new JButton("Average Each Band"); middleBandButton.addActionListener(new ButtonListener()); resetButton = new JButton("Reset"); resetButton.addActionListener(new ButtonListener()); panel.add(redBandButton); panel.add(blueBandButton); panel.add(greenBandButton); panel.add(inverseBandButton); panel.add(middleBandButton); panel.add(resetButton); container.add(BorderLayout.SOUTH, panel); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setSize(displayPanel.getWidth(), displayPanel.getHeight()); setVisible(true); } public static void main(String arg[]) { new CombineApp(); } class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); if (button.equals(redBandButton)) { displayPanel.bandCombine(CombinePanel.RED_BAND_MATRIX); displayPanel.repaint(); } else if (button.equals(greenBandButton)) { displayPanel.bandCombine(CombinePanel.GREEN_BAND_MATRIX); displayPanel.repaint(); } else if (button.equals(blueBandButton)) { displayPanel.bandCombine(CombinePanel.BLUE_BAND_MATRIX); displayPanel.repaint(); } else if (button.equals(inverseBandButton)) { displayPanel.bandCombine(CombinePanel.INVERSE_BAND_MATRIX); displayPanel.repaint(); } else if (button.equals(middleBandButton)) { displayPanel.bandCombine(CombinePanel.AVERAGE_BAND_MATRIX); displayPanel.repaint(); } else if (button.equals(resetButton)) { displayPanel.reset(); displayPanel.repaint(); } } } } class CombinePanel extends JLabel { // red band Matrix static final float RED_BAND_MATRIX[][] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } }; // green band Matrix static final float GREEN_BAND_MATRIX[][] = { { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } }; // blue band Matrix static final float BLUE_BAND_MATRIX[][] = { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; // Matrix that inverts all the bands // the nagative of the image. static final float INVERSE_BAND_MATRIX[][] = { { -1.0f, 0.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, { 0.0f, 0.0f, -1.0f } }; // Matrix that reduces the intensities of all bands static final float AVERAGE_BAND_MATRIX[][] = { { 0.5f, 0.0f, 0.0f }, { 0.0f, 0.5f, 0.0f }, { 0.0f, 0.0f, 0.5f } }; Image displayImage; // The source and destination images BufferedImage biSrc; BufferedImage biDest; // The source and destination rasters Raster srcRaster; WritableRaster dstRaster; BufferedImage bi; Graphics2D big; CombinePanel() { setBackground(Color.black); loadImage(); setSize(displayImage.getWidth(this), displayImage.getWidth(this)); createBufferedImages(); bi = biSrc; } public void loadImage() { displayImage = Toolkit.getDefaultToolkit().getImage("largeJava2sLogo.jpg"); MediaTracker mt = new MediaTracker(this); mt.addImage(displayImage, 1); try { mt.waitForAll(); } catch (Exception e) { System.out.println("Exception while loading."); } if (displayImage.getWidth(this) == -1) { System.out.println("No jpg) file"); System.exit(0); } } public void createBufferedImages() { biSrc = new BufferedImage(displayImage.getWidth(this), displayImage.getHeight(this), BufferedImage.TYPE_INT_RGB); big = biSrc.createGraphics(); big.drawImage(displayImage, 0, 0, this); srcRaster = biSrc.getRaster(); biDest = new BufferedImage(displayImage.getWidth(this), displayImage.getHeight(this), BufferedImage.TYPE_INT_RGB); dstRaster = (WritableRaster) biDest.getRaster(); } public void bandCombine(float[][] bandCombineMatrix) { BandCombineOp bandCombineOp = new BandCombineOp(bandCombineMatrix, null); bandCombineOp.filter(srcRaster, dstRaster); bi = biDest; } public void reset() { big.setColor(Color.black); big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this)); big.drawImage(displayImage, 0, 0, this); bi = biSrc; } public void update(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); paintComponent(g); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; g2D.drawImage(bi, 0, 0, this); } }