// This example is from the book _Java AWT Reference_ by John Zukowski.
// Written by John Zukowski. Copyright (c) 1997 O'Reilly & Associates.
// You may study, use, modify, and distribute this example for any purpose.
// This example is provided WITHOUT WARRANTY either expressed or
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.ColorModel;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
public class MainClass extends Applet {
Image i, j;
public void init() {
i = getImage(getDocumentBase(), "rosey.jpg");
MediaTracker mt = new MediaTracker(this);
mt.addImage(i, 0);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Loaded");
j = createImage(new FilteredImageSource(i.getSource(), new BlurFilter()));
System.out.println("Created");
}
public void paint(Graphics g) {
g.drawImage(i, 10, 10, this); // regular
if (j != null)
g.drawImage(j, 250, 10, this); // average
}
}
// This example is from the book _Java AWT Reference_ by John Zukowski.
// Written by John Zukowski. Copyright (c) 1997 O'Reilly & Associates.
// You may study, use, modify, and distribute this example for any purpose.
// This example is provided WITHOUT WARRANTY either expressed or
class BlurFilter extends ImageFilter {
private int savedWidth, savedHeight, savedPixels[];
private static ColorModel defaultCM = ColorModel.getRGBdefault();
public void setDimensions(int width, int height) {
savedWidth = width;
savedHeight = height;
savedPixels = new int[width * height];
consumer.setDimensions(width, height);
}
public void setColorModel(ColorModel model) {
// Change color model to model you are generating
consumer.setColorModel(defaultCM);
}
public void setHints(int hintflags) {
// Set new hints, but preserve SINGLEFRAME setting
consumer
.setHints(TOPDOWNLEFTRIGHT | COMPLETESCANLINES | SINGLEPASS | (hintflags & SINGLEFRAME));
}
private void setThePixels(int x, int y, int width, int height, ColorModel cm, Object pixels,
int offset, int scansize) {
int sourceOffset = offset;
int destinationOffset = y * savedWidth + x;
boolean bytearray = (pixels instanceof byte[]);
for (int yy = 0; yy < height; yy++) {
for (int xx = 0; xx < width; xx++)
if (bytearray)
savedPixels[destinationOffset++] = cm.getRGB(((byte[]) pixels)[sourceOffset++] & 0xff);
else
savedPixels[destinationOffset++] = cm.getRGB(((int[]) pixels)[sourceOffset++]);
sourceOffset += (scansize - width);
destinationOffset += (savedWidth - width);
}
}
public void setPixels(int x, int y, int width, int height, ColorModel cm, byte pixels[],
int offset, int scansize) {
setThePixels(x, y, width, height, cm, pixels, offset, scansize);
}
public void setPixels(int x, int y, int width, int height, ColorModel cm, int pixels[],
int offset, int scansize) {
setThePixels(x, y, width, height, cm, pixels, offset, scansize);
}
public void imageComplete(int status) {
if ((status == IMAGEABORTED) || (status == IMAGEERROR)) {
consumer.imageComplete(status);
return;
} else {
int pixels[] = new int[savedWidth];
int position, sumArray[], sumIndex;
sumArray = new int[9]; // maxsize - vs. Vector for performance
for (int yy = 0; yy < savedHeight; yy++) {
position = 0;
int start = yy * savedWidth;
for (int xx = 0; xx < savedWidth; xx++) {
sumIndex = 0;
sumArray[sumIndex++] = savedPixels[start + xx];
if (yy != (savedHeight - 1))
sumArray[sumIndex++] = savedPixels[start + xx + savedWidth];
if (yy != 0)
sumArray[sumIndex++] = savedPixels[start + xx - savedWidth];
if (xx != (savedWidth - 1))
sumArray[sumIndex++] = savedPixels[start + xx + 1];
if (xx != 0)
sumArray[sumIndex++] = savedPixels[start + xx - 1];
if ((yy != 0) && (xx != 0))
sumArray[sumIndex++] = savedPixels[start + xx - savedWidth - 1];
if ((yy != (savedHeight - 1)) && (xx != (savedWidth - 1)))
sumArray[sumIndex++] = savedPixels[start + xx + savedWidth + 1];
if ((yy != 0) && (xx != (savedWidth - 1)))
sumArray[sumIndex++] = savedPixels[start + xx - savedWidth + 1];
if ((yy != (savedHeight - 1)) && (xx != 0))
sumArray[sumIndex++] = savedPixels[start + xx + savedWidth - 1];
pixels[position++] = avgPixels(sumArray, sumIndex);
}
consumer.setPixels(0, yy, savedWidth, 1, defaultCM, pixels, 0, savedWidth);
}
consumer.imageComplete(status);
}
}
private int avgPixels(int pixels[], int size) {
float redSum = 0, greenSum = 0, blueSum = 0, alphaSum = 0;
for (int i = 0; i < size; i++)
try {
int pixel = pixels[i];
redSum += defaultCM.getRed(pixel);
greenSum += defaultCM.getGreen(pixel);
blueSum += defaultCM.getBlue(pixel);
alphaSum += defaultCM.getAlpha(pixel);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Ooops");
}
int redAvg = (int) (redSum / size);
int greenAvg = (int) (greenSum / size);
int blueAvg = (int) (blueSum / size);
int alphaAvg = (int) (alphaSum / size);
return ((0xff << 24) | (redAvg << 16) | (greenAvg << 8) | (blueAvg << 0));
}
}