//////////////////// PixelGrabberDemo.java ////////////////////
class PixelGrabberDemo
{
public static void main(String args[])
{
// パラメータの取得
String image_name = args[0];
int rate = Integer.parseInt(args[1]);
new MainWindow(image_name,rate);
}
}
////////////////////////////////////////////////////////////
//////////////////// MainWindow.java ////////////////////
import java.awt.*;
import java.awt.event.*;
// メインウインドウ
class MainWindow extends Frame
{
public MainWindow(String image_name,int rate)
{
super("Mosaic Filter");
// ウインドウリスナの追加
WindowListener listener = new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
};
addWindowListener(listener);
// イメージの取得
Toolkit toolkit = getToolkit();
Image image = toolkit.getImage(image_name);
// イメージの読み込み待ち
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image,1);
try
{
tracker.waitForID(1);
}
catch(InterruptedException e)
{
System.err.println(e.toString());
}
// キャンバスの生成
ImageCanvas canvas = new ImageCanvas(image,rate);
canvas.setSize(image.getWidth(canvas),image.getHeight(canvas));
add(canvas,BorderLayout.CENTER);
// ウインドウの表示
pack();
setVisible(true);
}
}
////////////////////////////////////////////////////////////
//////////////////// ImageCanvas.java ////////////////////
import java.awt.*;
import java.awt.image.PixelGrabber;
import java.awt.image.MemoryImageSource;
// イメージ表示キャンバス
class ImageCanvas extends Canvas
{
Image image;
Image mosaic_image;
// コンストラクタ
public ImageCanvas(Image image,int rate)
{
MosaicFilter filter = new MosaicFilter(image,rate);
mosaic_image = filter.pixelize(this);
}
// イメージの描画
public void paint(Graphics g)
{
g.drawImage(mosaic_image,0,0,this);
}
}
////////////////////////////////////////////////////////////
//////////////////// MosaicFilter.java ////////////////////
import java.awt.*;
import java.awt.image.PixelGrabber;
import java.awt.image.MemoryImageSource;
import java.awt.image.ImageObserver;
class MosaicFilter
{
ImageObserver observer;
Image image;
int rate;
int pixels[];
public MosaicFilter(Image image,int rate)
{
this.image = image;
this.rate = rate;
}
// イメージのモザイク化
public Image pixelize(ImageObserver observer)
{
this.observer = observer;
int width = image.getWidth(observer);
int height = image.getHeight(observer);
// イメージの幅、高さがレートで割り切れるかどうか
// 割り切れないときは、補正ismodをかける
int ismod = 0;
if((width % rate + height % rate) > 0)
{
ismod = 1;
}
// PixelGrabberの構築
pixels = new int[width * height];
PixelGrabber pg = new PixelGrabber(image,0,0,width,height,pixels,0,width);
try
{
// 配列にイメージが格納されるのを待つ
pg.grabPixels();
}
catch(InterruptedException e)
{
System.err.println(e.toString());
}
// 各基点を探し出す
for(int i=0;i<pixels.length - (rate * width) * ismod;i+=width * rate)
{
for(int j=0;j<width - ((rate - 1) * ismod);j+=rate)
{
HandleBasicPixel(i+j);
}
}
MemoryImageSource memory_image = new MemoryImageSource(width,height,pixels,0,width);
Toolkit toolkit = Toolkit.getDefaultToolkit();
return(toolkit.createImage(memory_image));
}
// 基点を元にした矩形の取得とピクセル値の合成
protected void HandleBasicPixel(int point)
{
int width = image.getWidth(observer);
int red,green,blue;
red = green = blue = 0;
// 矩形の色の取得と合成
for(int i=0;i<rate;i++)
{
for(int j=0;j<rate;j++)
{
int current_point = point + i*width + j;
red += ((pixels[current_point] & 0x00FF0000) >> 16);
green += ((pixels[current_point] & 0x000FF00) >> 8);
blue += pixels[current_point] & 0x000000FF;
}
}
// 矩形内の色の平均値を計算
red = (red / (rate*rate)) << 16;
green = (green / (rate*rate)) << 8;
blue = blue / (rate*rate);
// 各ピクセルに合成値をセット
for(int i=0;i<rate;i++)
{
for(int j=0;j<rate;j++)
{
int current_point = point + i*width + j;
pixels[current_point] = 0xFF000000 | red | green | blue;
}
}
}
}
////////////////////////////////////////////////////////////
Source is here. (ZIP Format,2422Byte,Shift-JIS)