Mega Code Archive

 
Categories / Java by API / Java Awt Image
 

New FilteredImageSource(ImageProducer orig, ImageFilter imgf)

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