/* Date: %H% %T% File is: %Y%/%M% Release: %I% * Last Modified: %G% %U% by: abb@nuccard.eushc.org * Copyright (c) Andrew B. Barclay %H%. All rights reserved. */ /* * A quickie applet to try grayscale window/level using ImageFilter's. * Original URL http://www.emory.edu/CRL/abb/WindowLevel/ * * @see GrayFilter * @see RGBImageFilter * @see Rotator * * @version %I% %D% * @author Andrew Barclay * * Required Params (same as Rotator): * src -- Name of source image file * width -- Width of display window * height -- Height of display window * Optional Params (same as Rotator): * frames -- Number of source image frames (default: 1) * framewidth -- Width of source image frames (default: width) * frameheight -- Height of source image frames (default: height) * rate -- Rate in frames per second (default: 6) * columns -- Number of frames across the image (default: frames) * rows -- Number of frames down the image (default: 1) * autoReverse -- self explanatory? (default: false) */ // I like to know what I'm importing for sanity checks. import java.applet.Applet ; import java.awt.image.ImageObserver ; import java.awt.image.FilteredImageSource ; import java.awt.Color ; import java.awt.Event ; import java.awt.FontMetrics ; import java.awt.Graphics ; import java.awt.Image ; import java.awt.Polygon ; import java.awt.Rectangle ; // Classes that I've added: import Rotator ; import GrayFilter ; public class WindowLevel extends Rotator { final static int handlesize = 10 ; double upper, lower ; Polygon upperP, lowerP ; int dragging = 0 ; Image srcim, filteredim ; GrayFilter filter ; boolean forcepaint = false ; public String getAppletInfo() { return "Grayscale Window/Level by Andrew Barclay" ; } /* ============================================================ * Initializing stuff: */ public void init() { super.init() ; srcim = spinImage ; setUpper( 0.975 ) ; setLower( 0.05 ) ; } /* ============================================================ * Image painting stuff. */ public void paint( Graphics gr ) { // filter the srcim to make filteredim. windowImage() ; spinImage = filteredim ; // Invoke Rotator.paint() super.paint( gr ) ; // paint our manipulation handles. paintHandle( gr, upperP ) ; paintHandle( gr, lowerP ) ; } void windowImage() { if( filter == null || filter.upper != upper || filter.lower != lower || forcepaint ) { filter = new GrayFilter( upper, lower ) ; filteredim = createImage( new FilteredImageSource( srcim.getSource(), filter ) ) ; forcepaint = false ; } } /* ============================================================ * Grayscale manipulation stuff. */ synchronized void setUpper( double value ) { upper = value ; upperP = newPolygon( value ) ; } synchronized void setLower( double value ) { lower = value ; lowerP = newPolygon( value ) ; } Polygon newPolygon( double value ) { int xpoints[] = new int[3] ; int ypoints[] = new int[3] ; int yloc = (int)( 0.5 + value*(windowHeight-1) ) ; xpoints[0] = xpoints[2] = 0 ; xpoints[1] = handlesize ; ypoints[0] = yloc + handlesize/2 ; ypoints[1] = yloc ; ypoints[2] = yloc - handlesize/2 ; return new Polygon( xpoints, ypoints, 3 ) ; } void paintHandle( Graphics gr, Polygon polygon ) { Rectangle bbox = polygon.getBoundingBox() ; int yc = bbox.y + bbox.width/2 ; int yt = yc + (gr.getFontMetrics()).getHeight()/4 ; gr.setColor( Color.red ) ; gr.fillPolygon( polygon ) ; gr.setColor( Color.red ) ; gr.drawString( Integer.toString( yc ), handlesize, yt ) ; } public boolean mouseUp( Event evt, int x, int y ) { dragging = 0 ; System.out.println( "mouseUp: forcing repaint" ) ; forcepaint = true ; repaint( 0 ) ; return true ; } public boolean mouseDown( Event evt, int x, int y ) { if( upperP != null && upperP.inside( x, y ) ) { dragging = 1 ; return true ; } else if( lowerP != null && lowerP.inside( x, y ) ) { dragging = 2 ; return true ; } else { dragging = 0 ; return false ; } } public boolean mouseDrag( Event evt, int x, int y ) { if( dragging != 0 ) { double dy = (double)y/windowHeight ; dy = (dy < 0.0) ? 0.0 : ((dy > 1.0) ? 1.0 : dy) ; if( dragging == 1 ) { if( dy > lower ) { setUpper( dy ) ; } } else { if( dy < upper ) { setLower( dy ) ; } } repaint( 100 ) ; return true ; } else { return false ; } } }