LookupOp
A LookupOp maps the color values of the source to new color values in the destination. This operation is achieved with a lookup table that contains the destination values for each possible source value.
Lookup operations can be used to generate several common filters, such as negative filters, posterizing filters, and thresholding filters. Negative filters are interesting because they help illustrate how lookup tables work. Pixel colors are usually represented using three components (red, green, and blue) stored in 8 bits each. As a result, the color values of a negative image are the 8 bits' complements of the source image color values:
dstR = 255 – srcR; dstG = 255 – srcG; dstB = 255 – srcB;
To apply such a conversion to the source image, you must create a lookup table that associates all the values in the 8 bits range (from 0 to 255) to their complements:
short[] data = new short[256]; for (short i = 0; i < 256; i++) { data[i] = 255 - i; } BufferedImage dstImage = null; LookupTable lookupTable = new ShortLookupTable(0, data); LookupOp op = new LookupOp(lookupTable, null); dstImage = op.filter(sourceImage, null);
Figure 8-9 shows the result of this negative filter.
Figure 8-9 A simple lookup operation can be used to produce a negative image.
The LookupTable from this example contains only one lookup array, used for all of the color components of the source image, resulting in the same conversion of all of the color components.
To perform a different conversion for each component, you simply need to create one lookup array per color component in the source image. Since the example relies on an RGB picture, we can create a filter that inverts only the red component by defining three lookup arrays:
short[] red = new short[256]; short[] green = new short[256]; short[] blue = new short[256]; for (short i = 0; i < 256; i++) { red[i] = 255 - i; green[i] = blue[i] = i; } short[][] data = new short[][] { red, green, blue }; BufferedImage dstImage; LookupTable lookupTable = new ShortLookupTable(0, data); dstImage = op.filter(sourceImage, null); LookupOp op = new LookupOp(lookupTable, null);
You do not need to provide a lookup array for the alpha channel of your picture, if present. In this case, Java 2D will simply preserve the original alpha values. Whenever you create a new LookupOp, ensure that the number and size of your lookup arrays match the source image structure.