12.8 Antialiasing

As we've already seen, you can request that Java 2D perform antialiasing when it draws text and graphics. Antialiasing smooths the edges of shapes (such as text glyphs) and lines and reduces jaggies. Antialiased drawing is necessary because the outline of a shape drawn on a computer monitor can never be perfectly smooth; a mathematically perfect shape can't be mapped precisely onto a grid of discrete pixels. When the shape is drawn, the pixels inside the shape are filled, while the pixels outside are not. The outline of a shape rarely falls on perfect pixel boundaries, however, so approximations are made at the edges. The result is jagged lines that approximate the abstract shape you wish to represent.

Antialiasing is simply a technique for improving these approximations, using translucent colors. For example, if a pixel at the edge of a shape is half covered by the shape, the pixel is filled using a color that is half opaque. If only one-fifth of the pixel is covered, the pixel is one-fifth opaque. This technique works quite well to reduce jaggies. Figure 12-9 illustrates the process of antialiasing: it shows an antialiased figure that has been artificially enlarged to show the translucent colors used at the edges of shapes and text glyphs. The figure is generated by the straightforward code in Example 12-11.

Figure 12-9. Antialiasing enlarged
figs/jex3_1209.gif
Example 12-11. AntiAlias.java
package je3.graphics; import java.awt.*; import java.awt.geom.*; import java.awt.image.*; /** A demonstration of anti-aliasing */ public class AntiAlias implements GraphicsExample {     static final int WIDTH = 650, HEIGHT = 350;        // Size of our example     public String getName( ) {return "AntiAliasing";}   // From GraphicsExample     public int getWidth( ) { return WIDTH; }            // From GraphicsExample     public int getHeight( ) { return HEIGHT; }          // From GraphicsExample     /** Draw the example */     public void draw(Graphics2D g, Component c) {         BufferedImage image =                   // Create an off-screen image             new BufferedImage(65, 35, BufferedImage.TYPE_INT_RGB);         Graphics2D ig = image.createGraphics( ); // Get its Graphics for drawing         // Set the background to a gradient fill.  The varying color of         // the background helps to demonstrate the anti-aliasing effect         ig.setPaint(new GradientPaint(0,0,Color.black,65,35,Color.white));         ig.fillRect(0, 0, 65, 35);         // Set drawing attributes for the foreground.         // Most importantly, turn on anti-aliasing.         ig.setStroke(new BasicStroke(2.0f));                   // 2-pixel lines         ig.setFont(new Font("Serif", Font.BOLD, 18));          // 18-point font         ig.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   // Anti-alias!                             RenderingHints.VALUE_ANTIALIAS_ON);         // Now draw pure blue text and a pure red oval         ig.setColor(Color.blue);         ig.drawString("Java", 9, 22);         ig.setColor(Color.red);         ig.drawOval(1, 1, 62, 32);                  // Finally, scale the image by a factor of 10 and display it         // in the window.  This will allow us to see the anti-aliased pixels         g.drawImage(image, AffineTransform.getScaleInstance(10, 10), c);         // Draw the image one more time at its original size, for comparison         g.drawImage(image, 0, 0, c);     } }


Java Examples in a Nutshell
Java Examples in a Nutshell, 3rd Edition
ISBN: 0596006209
EAN: 2147483647
Year: 2003
Pages: 285

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net