我正在尝试使用Java中的BufferedImage创建透明的PNG图像。
PNG将加载到软件的另一部分,不支持Alpha通道。
这应该没问题,因为根据Chapter 8, section 5, part 4 of the PNG book,我可以通过将像素值指定为透明来实现透明度。这可以通过在png文件中创建tRNS
标头来实现。
我不确定如何将此技术细节转换为Java代码。实际图像本身是单色的;每个像素都将是黑色或白色。 我想用透明像素替换每个白色像素,而不使用Alpha通道。愿有人能把我推向正确的方向吗?
答案 0 :(得分:2)
您可以使用以下代码。
创建单色透明的BufferedImage:
public static BufferedImage createTransparentMonochromeBufferedImage(int w, int h)
{
// The color map contains the colors black and white
byte[] cMap = {0, 0, 0, (byte)255, (byte)255, (byte)255};
// Create an IndexColorModel setting white as the transparent color
IndexColorModel monochrome = new IndexColorModel(8, 2, cMap, 0, false, 1);
// Return a new BufferedImage using that color model
return new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED, monochrome);
}
将BufferedImage保存在PNG文件中:
public static void saveBufferedImageAsPNG(BufferedImage img, String filename)
throws IOException{
File file = new File(filename);
ImageIO.write(img, "png", file);
}
答案 1 :(得分:0)
我想你会想要使用IndexColorModel:http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/IndexColorModel.html。
答案 2 :(得分:0)
尝试以下方法:
BufferedImage
中第一个白色像素的索引。IndexColorModel
。ColorConvertOp
。您可以将null
作为RenderingHints
参数传递。ColorConvertOp.createCompatibleDestImage
] [3]接收新的BufferedImage
实例(目的地)。ColorConvertOp.filter
] [4]执行从源到目标的转换。我对此并不完全确定,但ColorConvertOp
似乎是一个很好的起点。告诉我们它是如何运作的!
[3]:http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#createCompatibleDestImage(java.awt.image.BufferedImage,java.awt.image.ColorModel) [4]:http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#filter(java.awt.image.BufferedImage,java.awt.image.BufferedImage)
答案 3 :(得分:-1)
我不知道,但我确定答案在The png Specification。希望这有帮助!
是不是有一个java用于编写png文件的库(也许是libpng的java绑定?),这会为你付出艰苦的努力吗? (当事情不能奏效时,可能会让你感到很头疼)