2011-02-07 13 views
6

Ho riscontrato problemi con la banding dei miei file PNG. Scavando nel problema ha prodotto due soluzioni. Entrambi hanno senso individualmente, ma insieme non lo fanno. Le soluzioni che ho scoperto:Soluzioni di banding PNG confuse

1) Spostare il file PNG nella cartella "raw". Ciò impedisce a AAPT di "ottimizzare" l'immagine che risulta in bande.

2) Modificare il formato pixel della finestra dell'attività in RGBA_8888 (ad esempio in onCreate aggiungere questa riga "getWindow(). SetFormat (PixelFormat.RGBA_8888)"). Su Android 2.2 e inferiore il formato pixel predefinito è 16 bit (565).

Ho provato entrambi e correggono l'effetto banding nelle mie immagini, tuttavia ora sono ancora più confuso su ciò che sta facendo Android.

Da un lato, se lascio il mio PNG nella cartella estraibile, è "ottimizzato" che si traduce in un effetto di banding nell'immagine. Magicamente scompare quando cambio il formato pixel a 32-bit. Se l'immagine fosse "ottimizzata", mi sarei aspettato che le bande rimanessero.

D'altra parte, se sposto il PNG nella cartella raw, manterrà il gradiente gradevole e verrà visualizzato correttamente anche se il pixelFormat è apparentemente a 16 bit.

Se qualcuno ha qualche idea di ciò che sta accadendo, lo apprezzerei.

Grazie,

-Dan

risposta

8

credo è abbastanza semplice:

Devi pensare al formato pixel della vostra attività (RGBA_8888) come ottimizzazione predefinita per le bitmap.

Se non è impostato, quindi precedente alla 2.2, per impostazione predefinita comprime la bitmap su RGB_565.

Ma se si dovesse creare a livello di programmazione una bitmap e impostarla su RGBA_8888, verrà utilizzata come tale dall'app.

Lo stesso si applica quando si inserisce la bitmap nella cartella raw: anche se il PixelFormat predefinito è impostato su RGB_565, l'attività lo utilizzerà così com'è senza "ottimizzarlo".

Quando si inserisce la bitmap nella cartella raw, non verrà affatto compressa e utilizzata come è anche se il PixelFormat predefinito è ancora RGB_565.

+1

Ah, quindi il dispositivo * è * in grado di visualizzare il colore a 32 bit, ma l'attività è impostata per utilizzare solo 16 bit prima di 2.3 se sto leggendo la tua risposta correttamente. – Dan

+0

Quasi: "ma l'attività è impostata per utilizzare 16 bit come valore predefinito prima di 2,3". Dire "SOLO" significherebbe non essere in grado di gestire contemporaneamente sia i 16 che i 32 bit, ma in realtà lo è. – Yahel

+0

Ok, grazie per la risposta. Penso di capirlo adesso. – Dan