2010-10-28 36 views
12

我有一個單通道PNG文件,我想用它作爲Porter-Duff繪圖操作的Alpha掩碼。如果我沒有任何選項加載它,則生成的位圖具有RGB_565配置,即視爲灰度。如果我將首選配置設置爲ALPHA_8,則會將其加載爲灰度ARGB_8888。Android:加載alpha掩碼位圖​​

我該如何說服Android將此文件視爲alpha蒙版而不是灰度圖像?

mask1 = BitmapFactory.decodeStream(pngStream); 
// mask1.getConfig() is now RGB_565 

BitmapFactory.Options maskOpts = new BitmapFactory.Options(); 
maskOpts.inPreferredConfig = Bitmap.Config.ALPHA_8; 
mask2 = BitmapFactory.decodeStream(pngStream, null, maskOpts); 
// mask2.getConfig() is now ARGB_8888 (the alpha channel is fully opaque) 
+0

當您將首選配置設置爲ARGB_8888時會發生什麼? – EboMike 2010-10-28 19:14:45

+0

結果與ALPHA_8相同。我得到一個帶有不透明alpha通道的ARGB_8888位圖。 – kvance 2010-10-28 19:20:56

+0

你的png是什麼顏色的?我猜0,這是灰度。據我所知,沒有「僅alpha」的png文件。最接近你可以得到的將是一個8位調色板與索引身份映射到阿爾法 - 文件大小。但可能不值得。您的解決方法下面可能是最好的,你會得到。但我討厭成爲那個人:API正試圖在這裏告訴你一些事情!保持alpha和RGB在一起。總是。這將得到更快,更好的支持。通過使用ALPHA_8,您可以離開好路徑。如果可能,儘量將您的設計更改爲RGBA。 – starmole 2013-06-10 07:19:29

回答

5

更多一種變通方法比溶液:

我現在包括與RGB通道全零的RGBA PNG文件alpha通道。我可以使用ARGB_8888的首選配置加載此文件,然後提取其Alpha通道。這在掩碼文件中浪費了幾KB,並且在解碼圖像時存在大量內存。

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inPreferredConfig = Bitmap.Config.ARGB_8888; 
Bitmap source = BitmapFactory.decodeStream(pngStream, null, opts); 
Bitmap mask = source.extractAlpha(); 
source.recycle(); 
// mask.getConfig() is now ALPHA_8 
+0

你有沒有找到更好的解決方案?我遇到了同樣的問題。 – Tenfour04 2011-03-09 00:15:24

+0

@ TenFour04不幸的是,從來沒有這樣做過。 – kvance 2011-03-10 23:26:45