[见相关]
下面的代码打开一个微小的PNG图像,具有4位的调色板和透明度(TRNS块),并打印的像素(1,1)和(1,2)的值。 然后,它把从自动型图像以TYPE_4BYTE_ABGR和打印相同的像素值。
public static void images() throws IOException {
File png = new File("c:\\temp\\04ptx.png");
BufferedImage bi1 = ImageIO.read(png);
System.out.printf("%s is TYPE_BYTE_BINARY? %s (%d)\n",png,
String.valueOf(BufferedImage.TYPE_BYTE_BINARY==bi1.getType()),
bi1.getType());
int p1i1 = bi1.getRGB(1, 1);
int p2i1 = bi1.getRGB(2, 1);
System.out.printf("im1: p1=%08x %s p2=%08x %s\n",
p1i1,formatARGB(p1i1),p2i1,formatARGB(p2i1));
BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(),
BufferedImage.TYPE_4BYTE_ABGR);
bi2.getGraphics().drawImage(bi1, 0, 0, null);
int p1i2 = bi2.getRGB(1, 1);
int p2i2 = bi2.getRGB(2, 1);
System.out.printf("im2: p1=%08x %s p2=%08x %s\n",
p1i2,formatARGB(p1i2),p2i2,formatARGB(p2i2));
}
public static String formatARGB(int v) {
return String.format("(%d,%d,%d,%d)",
(v>>24)&0xFF,(v>>16)&0xFF,(v>>8)&0xFF,v&0xFF);
}
结果我得到的是
c:\temp\04ptx.png is TYPE_BYTE_BINARY? true (12)
im1: p1=80e25fb1 (128,226,95,177) p2=00000000 (0,0,0,0)
im2: p1=80e160b1 (128,225,96,177) p2=00000000 (0,0,0,0)
(当从JAI读取器被选中时,TYPE_BYTE_INDEXED选择代替,但像素值是相同的)。
我有两个问题在这里:
据文档 ,TYPE_BYTE_BINARY“表示不透明的字节填充1,2,或4位图像的图像有一个IndexColorModel没有阿尔法”。 这似乎在的结果,其示出了(正确地)为两个像素的α值矛盾。
原始结果(128,226,95,177)是正确的(一个可以与任何图像浏览器验证,或更好地与http://entropymine.com/jason/tweakpng/ )。 为什么要传递给TYPE_4BYTE_ABGR介绍本(小)的错误?
图像(4x3的,右半部分是完全透明的)是在这里: https://dl.dropboxusercontent.com/u/1608708/tech/04ptx.png
我的Java是
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) Client VM (build 23.7-b01, mixed mode, sharing)