2010-10-28 45 views
12

Tôi có tệp PNG một kênh tôi muốn sử dụng làm mặt nạ alpha cho các thao tác vẽ Porter-Duff. Nếu tôi tải nó mà không có bất kỳ tùy chọn nào, Bitmap kết quả có cấu hình RGB_565, tức là được xử lý như là thang độ xám. Nếu tôi đặt cấu hình ưa thích thành ALPHA_8, nó sẽ tải nó thành một ARGB_8888 màu xám thay thế.Android: tải bitmap mặt nạ alpha

Làm cách nào để thuyết phục Android coi tệp này là mặt nạ alpha thay vì hình ảnh thang độ xám?

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

Điều gì xảy ra khi bạn đặt cấu hình ưa thích thành ARGB_8888? – EboMike

+0

Kết quả tương tự như ALPHA_8. Tôi nhận được một bitmap ARGB_8888 với một kênh alpha đục. – kvance

+0

Loại màu nào là png của bạn? Tôi đoán là 0, màu xám. Theo tôi biết, không có tệp png "chỉ alpha". Việc gần nhất bạn có thể nhận được để đó sẽ là một bảng màu 8 bit với một bản đồ nhận dạng của chỉ mục để alpha - cho kích thước tập tin. Nhưng có lẽ không đáng. Cách giải quyết của bạn dưới đây có lẽ là cách tốt nhất bạn sẽ nhận được. Nhưng tôi ghét phải là anh chàng đó: API đang cố nói cho bạn điều gì đó ở đây! Giữ alpha và RGB cùng nhau. Luôn luôn. Nó sẽ được hỗ trợ nhanh hơn và tốt hơn. Bằng cách sử dụng ALPHA_8 bạn rời khỏi con đường tốt. Hãy thử thay đổi thiết kế của bạn thành RGBA nếu có thể. – starmole

Trả lời

5

Thêm một workaround hơn một giải pháp:

Tôi bây giờ bao gồm cả kênh alpha trong một tập tin với các kênh RGB tất cả zero RGBA PNG. Tôi có thể tải tập tin này với một cấu hình ưa thích của ARGB_8888 và sau đó trích xuất kênh alpha của nó. Điều này lãng phí một vài KB trong tập tin mặt nạ, và rất nhiều bộ nhớ trong khi giải mã hình ảnh.

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

Bạn đã bao giờ tìm được giải pháp tốt hơn chưa? Tôi đang chạy vào cùng một vấn đề này. – Tenfour04

+0

@ TenFour04 Không may, thật không may. – kvance

Các vấn đề liên quan