TITLE:PixelGrabberで画像を配列として取得し編集、書出し
Posted by terai at 2009-12-28

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

画像の配列を取り出すPixelGrabberを生成して、角を透過色で塗りつぶします。
  • category: swing folder: PixelGrabber title: PixelGrabberで画像を配列として取得し編集、書出し tags: [PixelGrabber, MemoryImageSource, BufferedImage, Graphics2D] author: aterai pubdate: 2009-12-28T11:50:47+09:00 description: 画像の配列を取り出すPixelGrabberを生成して、角を透過色で塗りつぶします。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTRBSkghZI/AAAAAAAAAgg/Ce52fcu-nQI/s800/PixelGrabber.png

概要

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

サンプルコード

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

#spanend
#spandel
int width  = image.getWidth(p);
#spanend
#spandel
int height = image.getHeight(p);
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
int[] pix  = new int[height * width];
PixelGrabber pg = new PixelGrabber(image, 0, 0, width, height, pix, 0, width);
try {
  pg.grabPixels();
#spandel
} catch (Exception e) {
#spanend
  e.printStackTrace();
#spanadd
} catch (InterruptedException ex) {
#spanend
  ex.printStackTrace();
}
#spanadd
Area area = makeNorthWestConer();
#spanend
#spanadd
Rectangle r = area.getBounds();
#spanend

#spandel
//NW
#spanend
#spandel
for(int y=0;y<5;y++) {
#spanend
  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;
#spanadd
Shape s = area; // NW
#spanend
#spanadd
for (int y = 0; y < r.height; y++) {
#spanend
  for (int x = 0; x < r.width; x++) {
    if (s.contains(x, y)) {
      pix[x + y * width] = 0x0;
    }
  }
}
#spandel
//NE
#spanend
#spandel
for(int y=0;y<5;y++) {
#spanend
  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;
#spanadd
AffineTransform at = AffineTransform.getScaleInstance(-1d, 1d);
#spanend
#spanadd
at.translate(-width, 0);
#spanend
#spanadd
s = at.createTransformedShape(area); //NE
#spanend
#spanadd
for (int y = 0; y < r.height; y++) {
#spanend
  for (int x = width - r.width; x < width; x++) {
    if (s.contains(x, y)) {
      pix[x + y * width] = 0x0;
    }
  }
}

解説

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

解説

上記のサンプルでは、ウィンドウのスクリーンショット画像からPixelGrabberint配列を生成し、左上、右上の角をWindows XP風に透過色で上書きしています。 角を置き換えた配列は、以下のようにMemoryImageSourceなどを使用して画像に変換しています。
  • 角を置き換えた配列は以下のようにMemoryImageSourceなどを使用して画像に変換
    MemoryImageSource producer = new MemoryImageSource(width, height, pix, 0, width);
    Image img = p.createImage(producer);
    #spandel
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
    #spanend
    #spanadd
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    #spanend
    Graphics g = bi.createGraphics();
    g.drawImage(img, 0, 0, null);
    g.dispose();
    
    #spandel
    //PNG画像ファイルとして保存
    #spanend
    #spandel
    //try {
    #spanend
    #spandel
    //  javax.imageio.ImageIO.write(
    #spanend
    #spandel
    //    bi, "png", java.io.File.createTempFile("screenshot", ".png"));
    #spanend
    #spandel
    //}catch(java.io.IOException ioe) {
    #spanend
    #spandel
    //  ioe.printStackTrace();
    #spanend
    #spandel
    //}
    #spanend
    #spanadd
    // PNG画像ファイルとして保存
    #spanend
    #spanadd
    // try {
    #spanend
    #spanadd
    //   javax.imageio.ImageIO.write(
    #spanend
    #spanadd
    //     bi, "png", java.io.File.createTempFile("screenshot", ".png"));
    #spanend
    #spanadd
    // } catch (IOException ioe) {
    #spanend
    #spanadd
    //   ioe.printStackTrace();
    #spanend
    #spanadd
    // }
    #spanend
    

コメント

  • 以下のように、Graphics2D#setComposite(AlphaComposite.Clear)として透過色で塗りつぶす方法もある
    #spanend
    #spanadd
    // BufferedImage image = ...;
    #spanend
    #spanadd
    int w = image.getWidth(null);
    #spanend
    #spanadd
    int h = image.getHeight(null);
    #spanend
    #spanadd
    
    #spanend
    #spanadd
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    #spanend
    #spanadd
    Graphics2D g2d = bi.createGraphics();
    #spanend
    #spanadd
    g2d.drawImage(image, 0, 0, null);
    #spanend
    #spanadd
    g2d.setComposite(AlphaComposite.Clear);
    #spanend
    #spanadd
    g2d.setPaint(new Color(0x0, true));
    #spanend
    #spanadd
    // NW
    #spanend
    #spanadd
    g2d.drawLine(0, 0, 4, 0);
    #spanend
    #spanadd
    g2d.drawLine(0, 1, 2, 1);
    #spanend
    #spanadd
    g2d.drawLine(0, 2, 1, 2);
    #spanend
    #spanadd
    g2d.drawLine(0, 3, 0, 4);
    #spanend
    #spanadd
    // NE
    #spanend
    #spanadd
    g2d.drawLine(w - 5, 0, w - 1, 0);
    #spanend
    #spanadd
    g2d.drawLine(w - 3, 1, w - 1, 1);
    #spanend
    #spanadd
    g2d.drawLine(w - 2, 2, w - 1, 2);
    #spanend
    #spanadd
    g2d.drawLine(w - 1, 3, w - 1, 4);
    #spanend
    #spanadd
    g2d.dispose();
    #spanend
    #spanadd
    

参考リンク

PixelGrabber (Java Platform SE 8)

コメント