没有Alpha通道的PNG透明度
我试图用Java中的BufferedImage创建一个透明的PNG图像。
PNG将被加载到另一个不支持alpha通道的软件中 。
这应该没问题,因为根据PNG书第4章第5节第4部分 ,我可以通过指定一个透明的像素值来实现透明度。 这可以通过在png文件中创建tRNS
标头来实现。
我不确定如何将此技术细节转换为Java代码。 实际图像本身是单色的; 每个像素都是黑色或白色。 我想用透明像素替换每个白色像素,而不使用alpha通道 。 愿有人能把我推向正确的方向吗?
您可以使用以下代码。
创建单色透明的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); }
我想你想使用一个IndexColorModel: http : //java.sun.com/j2se/1.4.2/docs/api/java/awt/image/IndexColorModel.html 。
请尝试以下方法:
- 找出
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)
我不知道,但我确定答案是在png规范中 。 希望这可以帮助!
是不是有一个java用于编写png文件的库(也许是libpng的java绑定?),这会为你付出艰苦的努力吗? (当事情不能奏效时,可能会让你头疼不已)