Swing/PixelGrabber のバックアップの現在との差分(No.2)
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:
概要
画像の配列を取り出すPixelGrabber
を生成して、角を透過色で塗りつぶします。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#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を透過色で上書きしています。解説
上記のサンプルでは、ウィンドウのスクリーンショット画像からPixelGrabber
でint
配列を生成し、左上、右上の角を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