2011-03-22 17 views
9

Podczas pracy z niektórymi bitmapami w systemie Android zauważyłem, że biały używany w widokach nie zawsze jest taki sam, biały renderowany na bitmapach. Rozważ ten zrzut ekranu.Białe nie jest białe

enter image description here

Tło białe jest z widokiem z białym tłem koloru.

Pierwszy plan "biały" pochodzi z białej bitmapy zdekodowanej z karty SD, wyświetlanej w ImageView. Ta mapa bitowa jest dekodowany przy użyciu RGB_565 następująco:

BitmapFactory.Options resample = new BitmapFactory.Options(); 
resample.inPreferredConfig = Config.RGB_565; 
resample.inSampleSize = sampleSize; 
return BitmapFactory.decodeFile(filePath, resample); 

Dla porównania here jest mapa bitowa.

Dlaczego tak jest i jak można go naprawić?

+1

Co jest biały bitmap konieczne? Mógł użyć kilka pustych linii: P – Marlon

+1

Ale potem: dlaczego tak długo, lub dlaczego nie tylko link do niego? – Arjan

+0

Powiązany z bitmapą zamiast dołączania jej do pytania. – hpique

Odpowiedz

0

Może to być różnica między typem obrazu a bitmapą, na której renderuje się ImageView, patrz Bitmap.Config. Załaduj obraz w różnych trybach i zobacz, czy to pomaga. Aby uzyskać więcej informacji, zobacz Bitmap quality and banding.

+0

Czy możesz rozwinąć nieco więcej? Dodałem Bitmap.Config, którego używam (RGB_565). – hpique

+0

Spróbuj ustawić okno i obraz, aby korzystać z tego samego trybu RGB i zobaczyć, co się stanie. Ustaw obraz tak jak powyżej i okno z 'getWindow(). GetAttributes() .form'. Wypróbuj RGB_8888 i sprawdź, czy nie jest biały. Czy wiesz, w jakim formacie RGB znajduje się oryginalny obraz? –

+0

Nie. Jak mogę sprawdzić format RGB obrazu (który jest powiązany z pytaniem, BTW)? Wiem, że to RGB, a głębokość to 8, zgodnie z Mac OS X Preview. – hpique

3

Mam ten sam problem i po kilku eksperymentach zauważyłem, że komentowanie <uses-sdk> rozwiązuje problem. Każda wartość powyżej 3 dla android:minSdkVersion uczyni ten efekt pojawiają (usuwanie <uses-sdk> tag skutecznie zmienia minSdkVersion do 1.

+0

Niestety to nie działa dla mnie. – radhoo

+0

To działało dla mnie, ale to niszczy układ tabletów – VicVu

1

miał bardzo podobny, jeśli nie identyczny problem, nawet ustawienie inPreferredConfig do ARGB_8888 nie pomogło.

Od to, co mogę zebrać z: http://android.nakatome.net/2010/04/bitmap-basics.html

Problem polega na tym, że Android automatycznie ditheruje obrazy 24-bitowe do 16-bitów, które mogą zepsuć kolory. Link wspomina, że ​​możesz wyłączyć to poprzez dodanie kanału alfa do obrazu, lub ładowanie go z katalogu surowego zamiast jako zasobu.

widziany jak żadna z nich nie była opcja dla mnie Znalazłem następujący wreszcie przepracowanych:

Paint ditherPaint = new Paint(); 
ditherPaint.setDither(true); 
canvas.drawBitmap(mDrawable.getBitmap(), null, 
        mDrawable.getBounds(), ditherPaint); 

Tutaj mDrawable jest typu BitmapDrawable.

0

Oto co rozwiązuje to dla mnie:

Musisz ustawić gęstość ekranu, aby zapobiec fabrykę bitmapy z przeskalowania mapy bitowej. Odbywa się to za pomocą następującego kodu:

DisplayMetrics displayMetrics=new DisplayMetrics(); 
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
wm.getDefaultDisplay().getMetrics(displayMetrics); 
resample.inScreenDensity = displayMetrics.densityDpi; 
+0

Co to są opcje? – VicVu

+1

Przepraszamy, należy to zmienić, tak jak w pierwotnym pytaniu. Jest to instancja BitmapFactory.Options, która następnie jest używana jako parametr dla metody BitmapFactory.decode * -method. – ChristophK

2

Spróbuj ustawić getWindow().setFormat(PixelFormat.RGB_565) w onCreate.

Domyślny format wydaje się zmieniać na podstawie wersji SDK i typu urządzenia, więc po prostu zmusić go do pobytu w RGB_565

Powiązane problemy