• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:PixelGrabberで画像を配列として取得し編集、書出し
#navi(../)
RIGHT:Posted by [[terai]] at 2009-12-28
*PixelGrabberで画像を配列として取得し編集、書出し [#cc3d247f]
画像の配列を取り出す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
---
* 概要 [#summary]
画像の配列を取り出す`PixelGrabber`を生成して、角を透過色で塗りつぶします。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTRBSkghZI/AAAAAAAAAgg/Ce52fcu-nQI/s800/PixelGrabber.png)

//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTRBSkghZI/AAAAAAAAAgg/Ce52fcu-nQI/s800/PixelGrabber.png)

**サンプルコード [#v6f90a8c]
#code{{
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);
* サンプルコード [#sourcecode]
#code(link){{
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();
} catch (InterruptedException ex) {
  ex.printStackTrace();
}
Area area = makeNorthWestConer();
Rectangle r = area.getBounds();

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

**解説 [#m27cc900]
上記のサンプルでは、ウインドウのスクリーンショット画像から、PixelGrabberで配列を生成し、左上、右上の角((Windows XP風))を透過色で上書きしています。
* 解説 [#explanation]
上記のサンプルでは、ウィンドウのスクリーンショット画像から`PixelGrabber`で`int`配列を生成し、左上、右上の角を`Windows XP`風に透過色で上書きしています。

角を置き換えた配列は、以下のようにMemoryImageSourceなどを使用して画像に変換しています。
- 角を置き換えた配列は以下のように`MemoryImageSource`などを使用して画像に変換
#code{{
MemoryImageSource producer = new MemoryImageSource(width, height, pix, 0, width);
Image img = p.createImage(producer);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();

//PNG画像ファイルとして保存
//try {
//  javax.imageio.ImageIO.write(
//    bi, "png", java.io.File.createTempFile("screenshot", ".png"));
//}catch(java.io.IOException ioe) {
//  ioe.printStackTrace();
//}
// PNG画像ファイルとして保存
// try {
//   javax.imageio.ImageIO.write(
//     bi, "png", java.io.File.createTempFile("screenshot", ".png"));
// } catch (IOException ioe) {
//   ioe.printStackTrace();
// }
}}

----
以下のような、Graphics2D#setComposite(AlphaComposite.Clear) として、透過色で塗りつぶす方法もあります。
- 以下のように、`Graphics2D#setComposite(AlphaComposite.Clear)`として透過色で塗りつぶす方法もある
#code{{
//BufferedImage image = ...;
// BufferedImage image = ...;
int w = image.getWidth(null);
int h = image.getHeight(null);

BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.setComposite(AlphaComposite.Clear);
g2d.setPaint(new Color(0,0,0,0));
//NW
g2d.drawLine(0,0,4,0);
g2d.drawLine(0,1,2,1);
g2d.drawLine(0,2,1,2);
g2d.drawLine(0,3,0,4);
//NE
g2d.drawLine(w-5,0,w-1,0);
g2d.drawLine(w-3,1,w-1,1);
g2d.drawLine(w-2,2,w-1,2);
g2d.drawLine(w-1,3,w-1,4);
g2d.setPaint(new Color(0x0, true));
// NW
g2d.drawLine(0, 0, 4, 0);
g2d.drawLine(0, 1, 2, 1);
g2d.drawLine(0, 2, 1, 2);
g2d.drawLine(0, 3, 0, 4);
// NE
g2d.drawLine(w - 5, 0, w - 1, 0);
g2d.drawLine(w - 3, 1, w - 1, 1);
g2d.drawLine(w - 2, 2, w - 1, 2);
g2d.drawLine(w - 1, 3, w - 1, 4);
g2d.dispose();
}}

//**参考リンク
**コメント [#y80493ae]
* 参考リンク [#reference]
[https://docs.oracle.com/javase/jp/8/docs/api/java/awt/image/PixelGrabber.html PixelGrabber (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment