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ファイル。
この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
背景が 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)
ちなみに、今回の環境は 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)