没有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 。

请尝试以下方法:

  1. 找出BufferedImage第一个白色像素的索引。
  2. 使用所需参数创建IndexColorModel
  3. 创建ColorConvertOp 。 您可以将null作为RenderingHints参数传递。
  4. 使用[ ColorConvertOp.createCompatibleDestImage ] [3]接收新的BufferedImage实例(目标)。
  5. 使用[ 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绑定?),这会为你付出艰苦的努力吗? (当事情不能奏效时,可能会让你头疼不已)