2010-10-28 14 views
12

Ich habe eine einkanalige PNG-Datei, die ich als Alpha-Maske für Porter-Duff-Zeichenoperationen verwenden möchte. Wenn ich es ohne Optionen lade, hat das resultierende Bitmap eine RGB_565-Konfig, d. H. Behandelt als Graustufen. Wenn ich die bevorzugte Konfiguration auf ALPHA_8 setze, wird sie stattdessen als Graustufe ARGB_8888 geladen.Android: Laden einer Alpha-Maske Bitmap

Wie kann ich Android davon überzeugen, diese Datei als Alphamaske anstatt als Graustufenbild zu behandeln?

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

Was passiert, wenn Sie die bevorzugte Konfiguration auf ARGB_8888 setzen? – EboMike

+0

Gleiches Ergebnis wie ALPHA_8. Ich bekomme eine ARGB_8888 Bitmap mit einem undurchsichtigen Alpha-Kanal. – kvance

+0

Welcher Farbtyp ist dein Png? Ich rate 0, das ist Graustufen. Soweit ich weiß gibt es keine "nur Alpha" -Png-Datei. Der nächste, den Sie erreichen könnten, wäre eine 8-Bit-Palette mit einer Identitätskarte von Index zu Alpha - für die Dateigröße. Aber wahrscheinlich nicht wert. Dein Workaround unten ist wahrscheinlich der beste, den du bekommst. Aber ich hasse es, der Typ zu sein: Die API versucht dir hier etwas zu sagen! Halte Alpha und RGB zusammen. Immer. Es wird schneller und besser unterstützt. Mit ALPHA_8 verlassen Sie den guten Pfad. Versuchen Sie, Ihr Design möglichst in RGBA zu ändern. – starmole

Antwort

5

Mehr von einer Vermeidung des Problems als eine Lösung:

Ich bin auch jetzt der Alpha-Kanal in einer RGBA PNG-Datei mit den RGB-Kanälen alle Nullen. Ich kann diese Datei mit einer bevorzugten Konfiguration von ARGB_8888 laden und dann ihren Alphakanal extrahieren. Dies verschwendet ein paar KB in der Maskendatei und viel Speicher beim Dekodieren des Bildes.

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

Haben Sie jemals eine bessere Lösung gefunden? Ich stoße auf dasselbe Problem. – Tenfour04

+0

@ TenFour04 Nie, leider. – kvance