MainClass.java Source code

Java tutorial

Introduction

Here is the source code for MainClass.java

Source

// 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));
    }
}