2010-10-28 1 views
12

Ho un file PNG a canale singolo che mi piacerebbe utilizzare come maschera alfa per le operazioni di disegno Porter-Duff. Se lo carico senza opzioni, la Bitmap risultante ha una configurazione RGB_565, cioè trattata come scala di grigi. Se imposto la configurazione preferita su ALPHA_8, la carica come ARGB_8888 in scala di grigio.Android: caricamento di una bitmap maschera alfa

Come posso convincere Android a trattare questo file come maschera alfa invece di un'immagine in scala di grigio?

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

Cosa succede quando si imposta la configurazione preferita su ARGB_8888? – EboMike

+0

Stesso risultato di ALPHA_8. Ottengo un bitmap ARGB_8888 con un canale alfa opaco. – kvance

+0

Di che colore è il tuo png? Sto indovinando 0, che è in scala di grigi. Per quanto ne so non esiste un file png "alpha only". Il più vicino che si potrebbe ottenere sarebbe una tavolozza a 8 bit con una mappa delle identità di indice in alfa - per le dimensioni del file. Ma probabilmente non ne vale la pena. La tua soluzione alternativa è probabilmente la migliore che otterrai. Ma odio essere quel ragazzo: l'API sta cercando di dirti qualcosa qui! Mantieni alfa e RGB insieme. Sempre. Sarà più veloce e meglio supportato. Usando ALPHA_8 lasci la buona strada. Prova a cambiare il tuo progetto in RGBA se possibile. – starmole

risposta

5

Più di una soluzione che una soluzione:

Ora sto tra cui il canale alfa in un file PNG con RGBA i canali RGB tutti zeri. Posso caricare questo file con una configurazione preferita di ARGB_8888 e quindi estrarre il suo canale alfa. Questo spreca pochi KB nel file maschera e molta memoria durante la decodifica dell'immagine.

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

Hai mai trovato una soluzione migliore? Sto incontrando lo stesso problema. – Tenfour04

+0

@ TenFour04 Mai fatto, sfortunatamente. – kvance