2010-10-28 18 views
12

Tengo un archivo PNG de canal único que me gustaría usar como máscara alfa para las operaciones de dibujo de Porter-Duff. Si lo cargo sin ninguna opción, el mapa de bits resultante tiene una configuración RGB_565, es decir, tratada como escala de grises. Si configuro la configuración preferida a ALPHA_8, la carga como una escala de grises ARGB_8888 en su lugar.Android: cargando un mapa de bits de máscara alfa

¿Cómo puedo convencer a Android de tratar este archivo como una máscara alfa en lugar de una imagen en escala de grises?

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

¿Qué sucede cuando configura la configuración preferida en ARGB_8888? – EboMike

+0

Mismo resultado que ALPHA_8. Obtengo un mapa de bits ARGB_8888 con un canal alfa opaco. – kvance

+0

¿Qué tipo de color es tu png? Supongo que 0, que es en escala de grises. Por lo que yo sé, no hay un archivo png "solo alfa". Lo más cerca que podrías llegar a eso sería una paleta de 8 bits con un mapa de identidad de índice a alfa, para el tamaño del archivo. Pero probablemente no valga la pena. Su solución alternativa a continuación es probablemente lo mejor que obtendrá. Pero odio ser ese tipo: ¡la API está tratando de decirte algo aquí! Mantenga alfa y RGB juntos. Siempre. Va a ser más rápido y mejor apoyado. Al usar ALPHA_8 dejas el buen camino. Intenta cambiar tu diseño a RGBA si es posible. – starmole

Respuesta

5

Más de una solución que una solución:

Ahora estoy incluyendo el canal alfa RGBA en un archivo PNG con los canales RGB todos ceros. Puedo cargar este archivo con una configuración preferida de ARGB_8888 y luego extraer su canal alfa. Esto desperdicia unos pocos KB en el archivo de máscara y mucha memoria mientras decodifica la imagen.

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

¿Alguna vez encontró una mejor solución? Me estoy encontrando con este mismo problema. – Tenfour04

+0

@ TenFour04 Nunca lo hizo, desafortunadamente. – kvance

Cuestiones relacionadas