2010-10-28 9 views
12

Mam jednokanałowy plik PNG, który chciałbym użyć jako maski alfa do operacji rysowania Porter-Duff. Jeśli załaduję go bez żadnych opcji, wynikowa mapa bitowa ma konfigurację RGB_565, czyli jest traktowana jako skala szarości. Jeśli ustawię preferowaną konfigurację na ALPHA_8, ładuję ją zamiast ARGB_8888 w skali szarości.Android: ładowanie mapy bitowej maski alfa

Jak mogę przekonać Androida do traktowania tego pliku jako maski alfa zamiast obrazu w skali szarości?

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

Co stanie się po ustawieniu preferowanej konfiguracji na ARGB_8888? – EboMike

+0

Ten sam wynik co ALPHA_8. Otrzymuję mapę bitową ARGB_8888 z nieprzezroczystym kanałem alfa. – kvance

+0

Jakiego rodzaju jest twój png? Zgaduję 0, czyli w skali szarości. O ile mi wiadomo, nie ma pliku png "alpha only". Najbliżej można było uzyskać paletę 8-bitową z mapą identyczności indeksu do alfa - dla rozmiaru pliku. Ale prawdopodobnie nie warto. Twoje obejście poniżej jest prawdopodobnie najlepszym rozwiązaniem. Ale nie znoszę być tym facetem: API próbuje ci coś tutaj powiedzieć! Trzymaj alfa i RGB razem. Zawsze. Będzie szybszy i lepiej obsługiwany. Za pomocą ALPHA_8 pozostawiasz dobrą ścieżkę. Spróbuj zmienić swój projekt na RGBA, jeśli to w ogóle możliwe. – starmole

Odpowiedz

5

Więcej o obejście niż rozwiązanie:

jestem teraz tym kanałem alfa w pliku PNG RGBA z kanałów RGB wszystkie zera. Mogę załadować ten plik z preferowaną konfiguracją ARGB_8888, a następnie wyodrębnić jego kanał alfa. Powoduje to marnowanie kilku kilobajtów w pliku maski i dużo pamięci podczas dekodowania obrazu.

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

Czy kiedykolwiek znalazłeś lepsze rozwiązanie? Występuję w tym samym problemie. – Tenfour04

+0

@ TenFour04 Nigdy niestety nie. – kvance

Powiązane problemy