TITLE:PixelGrabberで画像を配列として取得し編集、書出し

Posted by terai at 2009-12-28

PixelGrabberで画像を配列として取得し編集、書出し

画像の配列を取り出すPixelGrabberを生成して、角を透過色で塗りつぶします。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

BufferedImage image;
try {
  image = javax.imageio.ImageIO.read(getClass().getResource("screenshot.png"));
}catch(java.io.IOException ioe) {
  ioe.printStackTrace();
  return;
}

int width  = image.getWidth(p);
int height = image.getHeight(p);
int[] pix  = new int[height * width];
PixelGrabber pg = new PixelGrabber(image, 0, 0, width, height, pix, 0, width);
try {
  pg.grabPixels();
} catch (Exception e) {
  e.printStackTrace();
}

//NW
for(int y=0;y<5;y++) {
  for(int x=0;x<5;x++) {
    if((y==0 && x<5) || (y==1 && x<3) ||
       (y==2 && x<2) || (y==3 && x<1) ||
       (y==4 && x<1) ) pix[y*width+x] = 0x0;
  }
}
//NE
for(int y=0;y<5;y++) {
  for(int x=width-5;x<width;x++) {
    if((y==0 && x>=width-5) || (y==1 && x>=width-3) ||
       (y==2 && x>=width-2) || (y==3 && x>=width-1) ||
       (y==4 && x>=width-1) ) pix[y*width+x] = 0x0;
  }
}

解説

上記のサンプルでは、ウインドウのスクリーンショット画像から、PixelGrabberで配列を生成し、左上、右上の角*1を透過色で上書きしています。

角を置き換えた配列は、以下のようにMemoryImageSourceなどを使用して画像に変換しています。

MemoryImageSource producer = new MemoryImageSource(width, height, pix, 0, width);
Image img = p.createImage(producer);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g = bi.createGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();

//try {
//  javax.imageio.ImageIO.write(
//    bi, "png", java.io.File.createTempFile("screenshot", ".png"));
//}catch(java.io.IOException ioe) {
//  ioe.printStackTrace();
//}

コメント