2012-04-20 10 views
14

Estoy tratando de resolver un problema con android ColorFilters. La documentación es muy pobre, por lo que el método principal es probar diferentes variantes.Android ColorFilter - Porter-Duff Modes

El problema:

Hay un mapa de bits. Algunos píxeles tienen alfa = 255, otros tienen alfa = 0. Estoy tratando de dibujar un círculo con un color específico. Quiero que el canal alfa no se modifique en el mapa de bits, pero al dibujar quiero multiplicar un color en el mapa de bits alfa.

Por lo tanto, al dibujar un círculo, quiero que los píxeles con alfa = 0 no se pinten, pero los píxeles con alfa = 255 se pinten en el color que yo quiera. El canal alfa no debe cambiar.

Estoy tratando de utilizar Porter-duff ColorFilter (clase PorterDuffColorFilter en sdk para Android).

hay demasiados modos y no-comprensible descripción en el sitio oficial aquí: http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

Creo que debería utilizar DST_ATOP o SRC_ATOP, pero no funcionan como he descrito.

Además, hay un parámetro extraño srcColor en el constructor de porter-duff colorfilter.

No entiendo qué significa "Sa" y "Sc" en las fórmulas [Da, Sc * Da + (1 - Sa) * Dc]. Puede ser del color que se pasó al constructor del filtro de color y también puede ser el color configurado por "paint.setColor".

¿Alguien sabe cómo funciona?

+0

Puede google portero duff para ver lo que significan estos modos. – Renard

+1

Este excelente documento explica los modos PorterDuff con imágenes: http://ssp.impulsetrain.com/porterduff.html Solo tenga en cuenta que no agrega "src_" como lo hace Android: entonces "IN" = "SRC_IN" –

Respuesta

10

Sa y Sc son cortos para "fuente alfa" y "color de fuente", respectivamente. El parámetro srcColor en el constructor PorterDuffColorFilter es el color utilizado para estos valores.

Para su caso, el Mode.MULTIPLY probablemente funcione mejor.

+0

Pero cómo paint.setColor afecta en eso? Traté de cambiarlo y entendí que eso afecta! Creo que debería estar en esas fórmulas de mezcla? – user1038085

+0

Además, el modo multiplicar no funciona en este caso. Los píxeles con cero canales alfa también están pintados :( – user1038085

+0

No estoy del todo seguro sobre esta parte, pero creo que si establece un color para su pintura, este valor de alguna manera se incluirá en uno de los argumentos src/dst en algún momento Parece probable que el color alfa también se tenga en cuenta en los cálculos de tu caso, convirtiendo todo en un sólido 1.0-alfa. Deberías intentar dibujar el mapa de bits sin establecer un color en la pintura. – Jave

5

Tenga en cuenta que los modos Porter-Duff solo están definidos para funcionar correctamente con alfa premultiplicado. Eso significa que ninguno de los componentes R, G o B puede exceder el valor alfa.

GitHub project para el proyecto de Android que muestra todos los modos de Porter-Duff. El Android App también está disponible en Playstore.

+0

la aplicación muestra cómo las fórmulas afectan las imágenes muy bien. Sería mejor si incluye algunas imágenes más simples como una opción. –

1

Después de algunas investigaciones que llegaron a las conclusiones siguientes en relación con los modos PorterDuff color en Android,

  • SA y Sc son Fuente Alfa y Color de la fuente, por ejemplo, si estoy configurando ColorFilter en un drawable como myDrawable.setColorFilter (desiredColor, Mode.SRC_ATOP) los valores Sa y Sc se tomarán del color deseado, no de myDrawable. Da y Dc serán valores alfa y de color originales de myDrawable.
  • Tenía una imagen y deseo aplicar cierto color con valores alfa a partir de la entrada del usuario. Intenté usar PorterDuff Modes, My original myDrawable era un drawable de nueve parches y tenía un fondo transparente y esquinas trangulares como los triángulos de la burbuja de mensajes. Cuando utilicé

    public static final PorterDuff.Modo SRC [Sa, Sc]

que se aplica el color Fuente y Fuente alfa, lo que supone valores de color y alfa del método anterior setColorFilter DesiredColor, tengo valores de color correcta es decir, color y alfa se ha aplicado correctamente a la nueva Dibujable pero el triángulo en esa imagen fue completamente lavado/eliminado. Así que tuve que usar ColorMatrixFilter y la matriz de configuración y establecer el valor alfa por separado para dibujar.