簡體   English   中英

沒有 alpha 通道的 PNG 透明度

[英]PNG transparency without alpha channel

我正在嘗試從 Java 中的 BufferedImage 創建透明的 PNG 圖像。

PNG 將被加載到另一個不支持 alpha 通道的軟件中

那應該沒問題,因為根據PNG 手冊的第 8 章第 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

請嘗試以下操作:

  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)

我不知道,但我確定答案在The png Specification 中 希望這有幫助!

是不是有一個用於編寫 png 文件的 java 庫(也許是 libpng 的 java 綁定?)可以為您完成艱苦的工作嗎? (當事情不太好時,可能會為您省去很多麻煩)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM