Using Java 2D's Image-Processing Model
IMAGE-PROCESSING tools such as Adobe Photoshop and The GIMP offer a wide variety of filters you can apply on your pictures to create various special effects (see Figure 8-1). When you are designing a user interface, it is very tempting to use those effects. For instance, you could use a filter to blur an out-of-focus element in the UI. You could also increase the brightness of an image as the user moves the mouse over a component.
Figure 8-1 Applications like Adobe Photoshop have advanced image-processing capabilities.
Despite the impressive-looking results, image processing is not a difficult task to implement. Processing an image, or applying a filter, is just a matter of calculating a new color for each pixel of a source image. The information required to compute the new pixels varies greatly from one filter to another. Some filters, a grayscale filter for instance, need only the current color of a pixel; other filters, such as a sharpening filter, may also need the color of the surrounding pixels; still other filters, such as a rotation filter, may need additional parameters.
Since the introduction of Java 2D in J2SE 1.2, Java programmers have access to a straightforward image-processing model. You might have learned or read about the old producer-consumer model of Java 1.1. If you did, forget everything you know about it because the new model is much easier and more versatile. Java 2D's image-processing model revolves around the java.awt.image.BufferedImage class and the java.awt.image.BufferedImageOp interface.
A BufferedImageOp implementation takes a BufferedImage as input, called the source, and outputs another BufferedImage, called the destination, which is altered according to specific rules. Figure 8-2 shows how a blur filter produces the final image.
Figure 8-2 Filtering an image with Java 2D.
While the JDK does not offer concrete image filters, it does provide the foundations for you to create your own. If you need a sharpening or blurring filter, for example, you must know how to provide parameters to a ConvolveOp filter. We teach you such techniques in this chapter. Before we delve further into image-processing theory, let's see how we can use a BufferedImageOp to process an image.