Java by API/java.awt.image/FilteredImageSource

Материал из Java эксперт
Версия от 14:22, 31 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

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