2012-04-20 10 views
14

Sto cercando di risolvere un problema con Android ColorFilters. La documentazione è molto scarsa, quindi il metodo principale sta provando diverse varianti.Android ColorFilter - Modalità Porter-Duff

Il problema:

C'è una bitmap. Alcuni pixel hanno alpha = 255, altri hanno alpha = 0. Sto cercando di disegnare un cerchio con un colore specifico. Voglio il canale alfa invariato nella bitmap, ma mentre disegno voglio moltiplicare un colore per la bitmap-alpha.

Quindi, mentre si disegna un cerchio, voglio che i pixel con alfa = 0 non vengano dipinti, ma i pixel con alfa = 255 devono essere dipinti a colori che voglio. Il canale alfa non dovrebbe cambiare.

Sto cercando di utilizzare Porter-duff ColorFilter (classe PorterDuffColorFilter in sdk Android).

ci sono troppi modi e no-comprensibile descrizione sul sito ufficiale qui: http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

Penso che dovrei usare DST_ATOP o SRC_ATOP, ma non funzionano come ho descritto.

Inoltre, esiste uno strano parametro srcColor nel costruttore del filtro colore porter-duff.

Non riesco a capire cosa significa "Sa" e "Sc" nelle formule [Da, Sc * Da + (1 - Sa) * Dc]. Può essere dal colore che è stato passato al costruttore del filtro colorato e può anche essere impostato dal colore "paint.setColor".

Qualcuno sa, come funziona?

+0

Potresti vedere google porter duff per vedere cosa significano queste modalità. – Renard

+1

Questo ottimo documento spiega le modalità PorterDuff con le immagini: http://ssp.impulsetrain.com/porterduff.html Basta essere consapevoli che non aggiunge "src_" come fa Android: così "IN" = "SRC_IN" –

risposta

10

Sa e Sc sono i cortocircuiti rispettivamente per "sorgente alfa" e "colore sorgente". Il parametro srcColor nel costruttore PorterDuffColorFilter è il colore utilizzato per questi valori.

Per il tuo caso il Mode.MULTIPLY probabilmente funzionerebbe meglio.

+0

Ma come paint.setColor influisce su di esso? Ho provato a cambiarlo e ho capito che influenza! Penso che dovrebbe essere in tali formule di fusione? – user1038085

+0

Inoltre, la modalità di moltiplicazione non funziona in questo caso. Anche i pixel con canale alfa zero sono dipinti: ( – user1038085

+0

Non sono del tutto sicuro di questa parte, ma penso che se si imposta un colore sul proprio colore, questo valore verrà in qualche modo incluso in uno degli argomenti src/dst ad un certo punto Sembra probabile che anche il colore alpha venga preso nei calcoli nel tuo caso, rendendo tutto un solido 1.0-alpha. Dovresti provare a disegnare la bitmap senza impostare un colore sulla vernice. – Jave

5

Si noti che i modi Porter-Duff sono definiti solo per funzionare correttamente con alfa premoltiplicato. Ciò significa che nessuna delle componenti R, G o B può superare il valore alfa.

GitHub project per il progetto Android che mostra tutte le modalità Porter-Duff. Lo Android App è anche disponibile su Playstore.

+0

l'app mostra come le formule influenzano bene le immagini. Sarebbe meglio se includessi alcune immagini più semplici come opzione –

1

Dopo alcune ricerche ho venuto a seguenti conclusioni per quanto riguarda le modalità PorterDuff di colore in Android,

  • Sa e Sc sono di origine Alfa e Colore di sorgente, ad esempio se sto impostando ColorFilter su un drawable come myDrawable.setColorFilter (desiredColor, Mode.SRC_ATOP) i valori di Sa e Sc saranno presi da desiredColor non da myDrawable. Da e Dc saranno valori alfa e colore originali di myDrawable.
  • Avevo un'immagine e voglio applicare un determinato colore con valori alfa da input dell'utente. Ho provato a utilizzare le modalità PorterDuff, MyDrawable originale era un drawable a nove patch e aveva uno sfondo trasparente e angoli trangolari come triangoli a bolle di messaggistica. Quando ho usato

    pubblico finale statico PorterDuff.Modalità SRC [Sa, Sc]

che applica il colore di origine e Source Alpha, che avrei dovuto valori di colore e alfa di metodo di cui sopra setColorFilter desiredColor, ho ottenuto i valori dei colori corretti cioè colore e alfa è stato correttamente applicato alle nuove Drawable ma il triangolo su quell'immagine è stato completamente lavato/rimosso. Quindi ho dovuto usare ColorMatrixFilter e setup matrix e impostare il valore alfa separatamente su drawable.

Problemi correlati