Bleach.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.FilteredImageSource;

/**
 * 

Initially displays an unbleached image. Subsequent mouse * clicks in the canvas containing the image toggle between * a bleached version of the image and an unbleached version.

* */ public class Bleach { Image im; Image bleached; Bleach() { JFrame frame = new JFrame("Bleached Image"); JPanel panel = new DrawPanel(); Dimension d; /* // use AWT to get the image im = Toolkit.getDefaultToolkit().getImage("saint.gif"); waitForImage(panel, im); d = new Dimension(im.getWidth(panel),im.getHeight(panel) ); */ // use Swing to get the image ImageIcon icon = new ImageIcon("saint.gif"); im = icon.getImage(); d = new Dimension(icon.getIconWidth(),icon.getIconHeight() ); panel.setPreferredSize(d); int bp = 50; FilteredImageSource source = new FilteredImageSource(im.getSource(), new BleachImageFilter(bp)); bleached = panel.createImage(source); waitForImage(panel, bleached); Container c = frame.getContentPane(); c.add( new JLabel("Click image to toggle bleaching",JLabel.CENTER), BorderLayout.NORTH); c.add(panel,BorderLayout.CENTER); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } public static void waitForImage(JComponent component, Image im) { MediaTracker tracker = new MediaTracker(component); try { tracker.addImage(im, 0); tracker.waitForID(0); } catch(InterruptedException e) { System.out.println(e.toString()); } } class DrawPanel extends JPanel { boolean showBleached = false; DrawPanel() { addMouseListener(new myMouse() ); } public class myMouse extends MouseAdapter { public void mouseClicked(MouseEvent e) { showBleached = !showBleached; repaint(); } } public void paintComponent(Graphics g) { g.drawImage((showBleached? bleached: im),0,0,this); } } public static void main(String args[]) { new Bleach(); } }

BleachImageFilter.java

import java.awt.image.*;

/**
 * 

A derivation of RGBImageFilter that bleaches an image.

* *

Extent of the bleaching effect is controlled by the only * constructor argument: an integer representing the percentage * of bleaching. The percentage of bleaching may also be * controlled after instantiation by invoking the * void percent(int) method.

* * @version 1.0, Apr 1 1996 * @author David Geary * @see RGBImageFilter */ public class BleachImageFilter extends RGBImageFilter { private int percent; public BleachImageFilter(int percent) { this.percent = percent; canFilterIndexColorModel = true; } public int percent() { return percent; } public void percent(int percent) { percent = percent; } public int filterRGB(int x, int y, int rgb) { DirectColorModel cm = (DirectColorModel)ColorModel.getRGBdefault(); int alpha = cm.getAlpha(rgb); int red = cm.getRed (rgb); int green = cm.getGreen(rgb); int blue = cm.getBlue (rgb); double percentMultiplier = (double)percent/100; red = Math.min((int) (red + (red * percentMultiplier)), 255); green = Math.min((int) (green + (green * percentMultiplier)), 255); blue = Math.min((int) (blue + (blue * percentMultiplier)), 255); alpha = alpha << 24; red = red << 16; green = green << 8; return alpha | red | green | blue; } }


Maintained by John Loomis, last updated 15 June 2000