Estoy trabajando en una interfaz de usuario para una aplicación, y estoy intentando utilizar la escala de grises iconos, y permitir al usuario cambiar el tema a un color de su elección. Para hacer esto, estoy tratando de simplemente aplicar un ColorFilter de algún tipo a la superposición de un color en la parte superior de la imagen. He intentado usar PorterDuff.Modo.MULTIPLIQUE, y funciona casi exactamente lo que yo necesito, excepto que los blancos obtener superpuestas con el color así. Lo que estoy idealmente buscando es algo como el «Color» modo de fusión en Photoshop, donde el gráfico conserva su transparencia y luminosidad, y sólo modifica el color de la imagen. Por ejemplo:
Después de hacer algunas investigaciones, parece que la ColorMatrixColorFilter clase puede hacer lo que necesito, pero me parece que no puede encontrar cualquiera de los recursos, señalando cómo la matriz se utiliza. Es una matriz de 4×5, pero lo que necesito saber es cómo voy sobre el diseño de la matriz. Alguna idea?
EDIT: Lo bueno, lo que he encontrado hasta el momento en que esto es como sigue:
1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha
Donde esta matriz es la matriz de identidad (cuando se aplica, no hace ningún cambio), y los números en el rango de 0 a 1 (flotadores). Esta matriz se multiplica con cada píxel a convertir en el nuevo color. Así que esto es donde empieza a ser borroso para mí. Así que yo creo que sería cada pixel de 1 x 4 vector que contiene los argb de valores (por ejemplo,0.2, 0.5, 0.8, 1
) que sería de puntos con la matriz de transformación. Así que el doble de la intensidad del rojo de una imagen, se utiliza una matriz tales como:
2 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
lo que le daría un vector (de color) de 0.4, 0.5, 0.8, 1
. De la limitación de las pruebas, este parece ser el caso, y funciona correctamente, pero en realidad yo todavía terminan con el mismo problema (es decir, los blancos de ganancia para colorear). Seguir leyendo me dice que esto es porque está haciendo la conversión en valores RGB, mientras que para el tono cambio, los valores deben primero ser convertidos a valores HSL. Así que, posiblemente, podría escribir una clase que lea la imagen y convertir los colores, y volver a dibujar la imagen con los nuevos colores. Esto crea OTRO problema con StateListDrawables, como no estoy seguro de cómo iba a ir sobre cómo obtener cada uno de estos en el código y en la modificación de todos ellos, y la lentitud de un proceso que sería. :/
Hmm, bueno, así que supongo que otra pregunta que me gustaría tener es si una matriz se puede utilizar para convertir de RGB a otro espacio de color con la luminosidad de la información, tales como Lunb o HSL? Si es así, me podría multiplicar la matriz para que converstion, a continuación, hacer el ajuste de tono a QUE la matriz, a continuación, aplicar dicha matriz como la ColorFilter.
- El mejor artículo que he encontrado sobre este tema está aquí: active.tutsplus.com/tutorials/effects/…
Esto es lo que yo uso para mi juego. Esta es la recopilación de varias partes se encuentran en diversos artículos en las páginas web. Créditos va para el autor original de la @ver los enlaces.
Tenga en cuenta que mucho más se puede hacer con matrices de color. Incluyendo la inversión, etc…
Para completar esto debo agregar un ejemplo:
cleanValue()
método de hacer?mat
en el código tiene 5 filas? ¿No debería ser de 4 filas sólo (uno para cada R G B a)?ColorMatrix
, yo la tome de la espalda. La última fila enmat
nunca se utiliza en absoluto. ElColorMatrix
constructor toma solo las primeras 4 filas (copias de los primeros 20 carrozas de la fuente dada la matriz).aquí está el código completo si desea ajustar el brillo, contraste, saturación y tono. ¡A disfrutar!
Muchas gracias a @RichardLalancette
adjustContrast
método: (1) la expresiónvalue<<0
parece redundante, ya que siempre sería igual a (solo)value
. (2) Comovalue
es un número entero, novalue % 1
ser siempre igual a 0?Para cualquiera que esté interesado en cómo utilizar el ColorMatrixColorFilter. La muestra que se utiliza aquí, convertidos cada uno de los píxeles en color rojo cuando me dibujar el mapa de bits en el lienzo.
El comentario en la clase es de: http://developer.android.com/reference/android/graphics/ColorMatrix.html esto le da algunas ideas sobre cómo esto está funcionando
No hay una relación lineal entre la saturación y RGB. El tono es definida a trozos en 60° trozos (http://en.wikipedia.org/wiki/HSL_color_space#General_approach), y por lo tanto no es una simple conversión de la matriz entre HSV y RGB.
Para cambiar el tono de una imagen, puede utilizar el siguiente método :
Creo que este método le dará lo que usted desea:
http://android.okhelp.cz/hue-color-colored-filter-bitmap-image-android-example/
Al igual que el resto de las respuestas que utiliza una matriz de color para implementar este comportamiento, pero puede pasar en un Android de color de los recursos. La matriz, se asigna el color en un rango entre el valor de imagen y de color blanco.
Me hizo un poco ColorMatrixFilter probador, con base en el siguiente fragmento de código:
Usted puede ver aquí:
https://play.google.com/store/apps/details?id=org.vaelostudio.colormatrixtester
A pesar de que un montón de efectos útiles que se puede lograr mediante el uso de la
ColorMatrix
yo personalmente podría considerar el uso de unColorMap[]
junto conImageAttributes
. Al hacer esto, podemos definir que los colores deben ser reemplazados con la que los colores.ColorMap
? Yo creo que no hay tal clase disponibles en el estándar java/ android libs.