[英]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 。
請嘗試以下操作:
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)
我不知道,但我確定答案在The png Specification 中。 希望這有幫助!
是不是有一個用於編寫 png 文件的 java 庫(也許是 libpng 的 java 綁定?)可以為您完成艱苦的工作嗎? (當事情不太好時,可能會為您省去很多麻煩)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.