/* モザイク化 ImageFilter Ver 0.10 */ /* */ /* */ /* by Atsushi 2005/8/20 */ package net.antun.lib.awt.image; import java.awt.Dimension; import java.awt.image.ColorModel; public class MosaicImageFilter extends SinglepassImageFilter { /* --- Field --- */ private int size; /* --- Constructor --- */ public MosaicImageFilter(int size) { this.size=size; } /* --- フィルタリング --- */ public void setDimensions(int width,int height) { super.setDimensions(width,height); consumer.setDimensions(width,height); } protected void filterImage() { int rgb,p[],s; int r,g,b,a; p=new int[size]; for (int y=0;y<=originalSize.height-1;y+=size) { for (int x=0;x<=originalSize.width-1;x+=size) { a=r=g=b=0; s=0; for (int iy=0;iy<=size-1;iy++) { for (int ix=0;ix<=size-1;ix++) { if (0<=x+ix && x+ix<=originalSize.width -1 && 0<=y+iy && y+iy<=originalSize.height-1) { rgb=original[(x+ix)+(y+iy)*originalSize.width]; a+=(int)((rgb>>24) & 0xff); r+=(int)((rgb>>16) & 0xff); g+=(int)((rgb>> 8) & 0xff); b+=(int)((rgb>> 0) & 0xff); s++; } } } for (int ix=0;ix<=size-1;ix++) { p[ix]=((a/s)<<24) | ((r/s)<<16) | ((g/s)<<8) | ((b/s)<<0); } for (int iy=0;iy<=Math.min(size,originalSize.height-y)-1;iy++) { consumer.setPixels(x,y+iy, Math.min(size,originalSize.width-x),1, defaultRGB,p,0,size); } } } } public void setHints(int hint) { consumer.setHints(SINGLEPASS | (hint & SINGLEFRAME)); } /* --- 文字列化 --- */ public String toString() { return getClass().getName()+"[size="+size+"]"; } }