Lo compuse de esta manera:
Es una resolución de esta matriz:
a, e, f, 0, 0
d, b, f, 0, 0
d, e, c, 0, 0
0, 0, 0, 1, 0cuyos valores entregan:
salidaRoja = a * rojos + e * verdes + f * azules
salidaVerde = d * rojos + b * verdes + f * azules
salidaAzul = d * rojos + e *verdes + c * azules
salidaAlfa = 1
Sabiendo que las 3 salidas han de valer lo mismo (grises) para cada entrada de color
se pueden componer varias soluciones. La cuarta fila corresponde a alfa y la dejamos en valor 1.
Determine una de ellas :
a= 0.3 ; b=0.4 ; c= .11; una diagonal util que obliga el resto de valores complementarios a 1:
d = 1-a = 0.7 ; e = 1-b = 0.6 ; f = 1-c = .11;
Donde
d, e y
f son variaciones respectivas de
a, b y
c.
para ajustarlos en 100 pasos ya que a , b y c son decrecientes d, e y f son crecientes
a = 1 - .007 * n
b = 1 - .004 * n
c = 1 - .0089 * n
d = .003 * n
e = .006 * n
f = .0011 * n
Y ya está!
Si queremos pasarlo a gris simplemente ( sin transición) le aplicamos el filtro con n=100,
es decir, usando simplemente esta instrucción convertimos un mc cualquiera a gama de grises:
Código :
mc.filters =[new flash.filters.ColorMatrixFilter(
[0.3,0.59,0.11,0,0,0.3,0.59,0.11,0,0,0.3,0.59,0.11,0,0,0,0,0,1,0])];
Con la matriz totalmente simetrica sería:
Código :
mc.filters =[new flash.filters.ColorMatrixFilter(
[.333,.666,.111,0,0,.333,.666,.111,0,0,.333,.666,.111,0,0,0,0,0,1,0])];
que vista así:
[3/9, 6/9, 1/9, 0, 0,
3/9, 6/9, 1/9, 0, 0,
3/9, 6/9, 1/9, 0, 0,
0, 0, 0, 1, 0] Ahora se comprende mucho mejor.
Las pequeñas variaciones de esos valores que yo introduje son para aumentar el contraste. Pueden obviarse y quedaría una código más simple, -si cabe- usando solo una variable de 1/9 en lugar de seis si observamos la matriz anterior.
Para más aclaración consulta sobre resolución de matrices y en la ayuda de Flash sobre ese filtro.