没有Alpha通道的PNG透明度

时间:2009-12-28 16:18:42

标签: java png

我正在尝试使用Java中的BufferedImage创建透明的PNG图像。

PNG将加载到软件的另一部分,不支持Alpha通道

这应该没问题,因为根据Chapter 8, section 5, part 4 of the PNG book,我可以通过将像素值指定为透明来实现透明度。这可以通过在png文件中创建tRNS标头来实现。

我不确定如何将此技术细节转换为Java代码。实际图像本身是单色的;每个像素都将是黑色或白色。 我想用透明像素替换每个白色像素,而不使用Alpha通道。愿有人能把我推向正确的方向吗?

4 个答案:

答案 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)

答案 2 :(得分:0)

尝试以下方法:

  1. 找出BufferedImage中第一个白色像素的索引。
  2. 使用所需参数创建IndexColorModel
  3. 创建ColorConvertOp。您可以将null作为RenderingHints参数传递。
  4. 使用[ColorConvertOp.createCompatibleDestImage] [3]接收新的BufferedImage实例(目的地)。
  5. 使用[ColorConvertOp.filter] [4]执行从源到目标的转换。
  6. 我对此并不完全确定,但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绑定?),这会为你付出艰苦的努力吗? (当事情不能奏效时,可能会让你感到很头疼)