Swing/PixelGrabber のバックアップの現在との差分(No.10)
- category: swing folder: PixelGrabber title: PixelGrabberで画像を配列として取得し編集、書出し tags: [PixelGrabber, MemoryImageSource, BufferedImage, Graphics2D] author: aterai pubdate: 2009-12-28T11:50:47+09:00 description: 画像の配列を取り出すPixelGrabberを生成して、角を透過色で塗りつぶします。 image:
概要
画像の配列を取り出すPixelGrabber
を生成して、角を透過色で塗りつぶします。
Screenshot
Advertisement
サンプルコード
int[] pix = new int[height * width];
PixelGrabber pg = new PixelGrabber(image, 0, 0, width, height, pix, 0, width);
try {
pg.grabPixels();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
Area area = makeNorthWestConer();
Rectangle r = area.getBounds();
#spandel
Shape s = area; //NW
#spanend
#spanadd
Shape s = area; // NW
#spanend
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;
}
}
}
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;
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ウィンドウのスクリーンショット画像から、PixelGrabber
で配列を生成し、左上、右上の角をWindows XP
風に透過色で上書きしています。
上記のサンプルでは、ウィンドウのスクリーンショット画像からPixelGrabber
でint
配列を生成し、左上、右上の角をWindows XP
風に透過色で上書きしています。
角を置き換えた配列は、以下のようにMemoryImageSource
などを使用して画像に変換しています。
- 角を置き換えた配列は以下のように
MemoryImageSource
などを使用して画像に変換MemoryImageSource producer = new MemoryImageSource(width, height, pix, 0, width); Image img = p.createImage(producer); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 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 (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)
として、透過色で塗りつぶす方法もあります。
- 以下のように、
Graphics2D#setComposite(AlphaComposite.Clear)
として透過色で塗りつぶす方法もある#spandel //BufferedImage image = ...; #spanend #spanadd // BufferedImage image = ...; #spanend int w = image.getWidth(null); int h = image.getHeight(null); 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(0x0, true)); #spandel //NW #spanend #spanadd // NW #spanend g2d.drawLine(0, 0, 4, 0); g2d.drawLine(0, 1, 2, 1); g2d.drawLine(0, 2, 1, 2); g2d.drawLine(0, 3, 0, 4); #spandel //NE #spanend #spanadd // NE #spanend 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();