TITLE:MemoryImageSourceで配列から画像を生成

Posted by terai at 2010-06-07

MemoryImageSourceで配列から画像を生成

マウスのドラッグに応じて線を描画、消しゴムで消去する機能を実装します。

  • &jnlp;
  • &jar;
  • &zip;
MemoryImageSource.png

サンプルコード

int[] pixels = new int[320 * 240];
MemoryImageSource source = new MemoryImageSource(320, 240, pixels, 0, 320);
int penc = 0x0;
@Override public void paintComponent(Graphics g) {
  super.paintComponent(g);
  if(backImage!=null) {
    ((Graphics2D)g).drawImage(backImage, 0, 0, this);
  }
  if(source!=null) {
    g.drawImage(createImage(source), 0, 0, null);
  }
}
@Override public void mouseDragged(MouseEvent e) {
  Point pt = e.getPoint();
  double xDelta = e.getX() - startPoint.getX();
  double yDelta = e.getY() - startPoint.getY();
  double delta = Math.max(Math.abs(xDelta), Math.abs(yDelta));

  double xIncrement = xDelta / delta;
  double yIncrement = yDelta / delta;
  double xStart = startPoint.x;
  double yStart = startPoint.y;
  for(int i=0; i<delta; i++) {
    Point p = new Point((int)xStart, (int)yStart);
    if(p.x<0 || p.y<0 || p.x>=320 || p.y>=240) break;
    pixels[p.x + p.y * 320] = penc;
    for(int n=-1;n<=1;n++) {
      for(int m=-1;m<=1;m++) {
        int t = (p.x+n) + (p.y+m) * 320;
        if(t>=0 && t<320*240) {
          pixels[t] = penc;
        }
      }
    }
    repaint(p.x-2, p.y-2, 4, 4);
    xStart += xIncrement;
    yStart += yIncrement;
  }
  startPoint = pt;
}
@Override public void mousePressed(MouseEvent e) {
  startPoint = e.getPoint();
  penc = (e.getButton()==MouseEvent.BUTTON1)?0xff000000:0x0;
}

解説

上記のサンプルでは、左クリックでドラッグすると黒で、右クリックでドラッグすると透過色(0xff000000、消しゴム)で、自由曲線を描画することができます。 MemoryImageSourceに設定した画像の各ピクセルを表すint配列を、マウスのドラッグに応じて操作してImageを作成しています。

参考リンク

コメント