BufferedImage#setRGB で作ってみる。


import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
 
public class AlphaPNG {
 
  public static void main(String[] args) throws Exception {
    int width = 256;
    int height = 256;
    Color[] colors = new Color[] {
      new Color(255, 0, 0),
      new Color(0, 255, 0),
      new Color(0, 0, 255),
    };
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    for(int y=0; y<height; y++) {
      Color color = colors[(int)(y / ((double)height / colors.length))];
      for(int x=0; x<width; x++) {
        int a = x;
        int c =
          ((a & 0xFF) << 24) |
          ((color.getRed()   & 0xFF) << 16) |
          ((color.getGreen() & 0xFF) <<  8) |
          ((color.getBlue()  & 0xFF) <<  0);
        image.setRGB(x, y, c);
      }
    }
    ImageIO.write(image, "png", new File("rgba.png"));
  }
}

出力したPNGファイル。
Javaで透過度(アルファ値)のあるPNGファイルを出力する

このPNGファイルと円を何パターンか背景色を変えて BufferedImage (Graphics2D) 上に描画してみる。


import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
 
public class AlphaPngDraw {
 
  public static void main(String[] args) throws Exception {
    BufferedImage png = ImageIO.read(new File("rgba.png"));
    int w = png.getWidth();
    int h = png.getHeight();
    Color[] bgcolors = new Color[]{
      new Color(255, 255, 255, 255), // white
      new Color(255, 255, 255, 127), // white (alpha=50%)
      new Color(255, 255, 255,   0), // white (transparent)
      new Color(  0,   0,   0, 255), // black
      new Color(  0,   0,   0, 127), // black (alpha=50%)
      new Color(  0,   0,   0,   0), // black (transparent)
    };
    for(int i=0; i<bgcolors.length; i++){
      BufferedImage image =
        new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
      Graphics2D g = image.createGraphics();
      g.setBackground(bgcolors[i]);
      g.clearRect(0, 0, w, h);
      g.setColor(new Color(255, 175, 175, 127)); // pink (alpha=50%)
      g.setStroke(new BasicStroke((float)((w + h) / 2.0 / 6.0)));
      g.draw(new Ellipse2D.Double(w / 6.0, h / 6.0, w * 2.0 / 3.0, h * 2.0 / 3.0));
      g.drawImage(png, 0, 0, null);
      ImageIO.write(image, "png", new File("rgba" + i + ".png"));
    }
  }
}

pngcheck で調べてみたら6枚とも 「256 x 256 image, 32-bit RGB+alpha, non-interlaced」になってた。

背景が Color(255, 255, 255, 255), // white
Color(255, 255, 255, 255), // white

背景が new Color(255, 255, 255, 127), // white (alpha=50%)
new Color(255, 255, 255, 127), // white (alpha=50%)

背景が new Color(255, 255, 255, 0), // white (transparent)
new Color(255, 255, 255,   0), // white (transparent)

背景が new Color( 0, 0, 0, 255), // black
new Color(  0,   0,   0, 255), // black

背景が new Color( 0, 0, 0, 127), // black (alpha=50%)
new Color(  0,   0,   0, 127), // black (alpha=50%)

背景が new Color( 0, 0, 0, 0), // black (transparent)
new Color(  0,   0,   0,   0), // black (transparent)

ちなみに、今回の環境は Mac OS X Snow Leopard + Java 6


$ uname -mrsv
Darwin 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386
 
$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-10M3527)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)

tags: png java

Posted by NI-Lab. (@nilab)