没有 Alpha 通道的 PNG 透明度

发布于 2024-08-16 01:41:11 字数 404 浏览 4 评论 0原文

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

PNG 将被加载到不支持 Alpha 通道的另一个软件中。

这应该没问题,因为根据 第 8 章第 5 节第 4 部分PNG书中,我可以通过指定像素值透明来实现透明度。这是通过在 png 文件中创建 tRNS 标头来实现的。

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

I am trying to create a transparent PNG image from a BufferedImage in Java.

The PNG will be loaded into another piece of the software, that does not support the alpha channel.

That should be fine, because, according to Chapter 8, section 5, part 4 of the PNG book, I can achieve transparency by specifying a pixel value to be transparent. This works by creating a tRNS header in the png file.

I am unsure how to translate this technical detail to Java code. The actual image itself is monochrome; each pixel is going to be black or white. I would like to replace each white pixel with a transparent pixel, without using the alpha channel. May someone push me in the right direction please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一袭水袖舞倾城 2024-08-23 01:41:11

您可以使用以下代码。

创建单色且透明的 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);
}

You can use the following code.

Create a monochrome and transparent 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);
}

Save the BufferedImage in a PNG file:

public static void saveBufferedImageAsPNG(BufferedImage img, String filename)
                                                             throws IOException{
    File file = new File(filename); 
    ImageIO.write(img, "png", file);
}
紅太極 2024-08-23 01:41:11

请尝试以下操作:

  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.图像.ColorModel)
[4]: http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#filter(java.awt.image.BufferedImage, java.awt.图像.BufferedImage)

Try the following:

  1. Find out the index of the first white pixel from the BufferedImage.
  2. Create an IndexColorModel with the desired parameters.
  3. Create a ColorConvertOp. You can pass null as the RenderingHints argument.
  4. Use [ColorConvertOp.createCompatibleDestImage][3] to receive a new BufferedImage instance (destination).
  5. Use [ColorConvertOp.filter][4] to perform the conversion from the source to the destination.

I'm not completely sure about this, but the ColorConvertOp seems like a good starting point. Tell us how it works out!

[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)

原谅我要高飞 2024-08-23 01:41:11

我想你会想要使用 索引颜色模型

I think you'll want to use an IndexColorModel.

迷途知返 2024-08-23 01:41:11

我不知道,但我确信答案就在 png 规范。希望这有帮助!

是否有一个用于编写 png 文件的 java 库(也许是 libpng 的 java 绑定?)可以为您完成这项艰苦的工作? (当事情不太顺利时,可能会为你省去很多麻烦)

I don't know, but I'm sure the answer is in The png Specification. Hope this helps!

Isn't there a library for java for writing png files (java bindings for libpng perhaps?) that will do the hard work for you? (and probably save you many headaches when things don't quite work)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文