VBA Access: Aclarar u oscurecer color RGB
Dado un color obtenido mediante
RGB(R, G, B)
Necesito que ese color pueda convertirse a un valor claro o un color oscuro según se necesite. Ya tengo creadas las paletas de colores y el color necesita contrastar con su fondo, ergo, necesito que se aclare u oscurezca.
vRGBE = RGB(161, 136, 127) vRGBD = RGB(239, 235, 233) vRGBP = RGB(114, 91, 83) vRGBB = RGB(255, 255, 255) vRGBN = RGB(62, 39, 35) vRGBTE = ¿? VRGBTD = ?¿ vRGBTP = ¿?
Esos colores son aplicados a la interfaz por ende, al aplicar un fondo oscuro al detalle del formulario (vRGBE), necesito que ese mismo color sea más claro para el texto.
1 Respuesta
La modificación de un RGB sin alterar el color base se puede realizar en dos sentidos:
1) Quitando saturación a los colores. En el primer caso que planteas, ir subiendo el G i el B hasta que iguales el valor del color dominante (en este caso el R con 161). En este punto tendràs un gris con el mismo nivel de luminosidad que el color original
2) Aumentando el brillo a los colores (luminancia). En este caso deberás llevar el color dominante a valores superiores (p.e. 255 que es el máximo) y aumentar los otros colores en la misma proporción.
En este caso, una vez decidido hasta que nivel quieres subir el color dominante, el valor del resto de colores deben quedar en la misma prorcion respecto al nuevo valor del dominante, del que tenian en su valor original.
Es un simple problema de regla de tres.
Oh, gracias. Creí que había un comando que permitiera hacerlo. Es decir, pasar el valor RGB se podía pasar un valor (porcentaje, por ejemplo) que permita hacer ese mismo color pero más oscuro o más claro.
En fin.
Yo lo hago creando funciones:
Por ejemplo creo una rutina que se llama ColorAtenuado (R, G, B) y dentro de ella hago los cálculos de porcentajes de color según te explliqué:
1) Miro cual es el color dominante (el mayor de los 3) con una estructura If ... then
2) Calculo el porcentaje en el que quiero aumentar el color dominante: p.e., suponiendo que R sea el dominante, Porcentaje=((NValor/R)-1)*100, donde NValor podria ser 255 o el que más te guste.
3) Aplico este porcentaje de incremento de luminosidad a los tres colores básicos: a R, a G y a B
Y listo.
Esta Sub la tengo el un Módulo de utilidades y la llamo cuando me interesa.
No me queda muy claro cómo funciona el cálculo Porcentaje=((NValor/R)-1)*100 (o qué usa y obtiene, más bien) y qué pasaría si el valor es 255 y lo quiero aclarar o es 0 y lo quiero oscurecer.
Me interesó pero como lo mío es escribir novelas y no las matemáticas ni la lógica (lo de programar es más amateur mediante foros y tutos que otra cosa), no logro encontrar el punto.
Los 3 colores básicos van de un rango de 0 (sin presencia de este color) a 255 (máxima presencia del color). Los tres colores a 0 nos dan negro y los 3 colores a 255 nos dan blanco.
Vamos a ver un caso concreto
En este caso tenemos un color azulado (recuadro con etiqueta "nuevo") que está formado por 255 de azul, 114 de verde y 0 de rojo (valores RGB).
Si tu quieres aclarar este color, por ejemplo para pasar del actual (parte superior derecha de la paleta) a uno más claro (parte superior central de la paleta), deberás subir los valores del R i el G, porque el azul, que es el dominante, ya está al máximo.
Para este supuesto pues:
El B se queda igual
Para el G tengo aún un recorrido que va desde ell 114 al 255. Como quiero quedarme a medio camino del blanco, su nuevo valor seria su valor actua 114, más la mitad del recorrido entre 114 y 255: 114 + (255 - 114)/2 = 184. O lo que es lo mismo 114 + (255 - 114) * 0,5
Para el R lo mismo: 0 + (255 - 0) * 0,5 = 128
Por lo tanto el 128, 184, 128 seria el color de la parte superior central de la paleta.
Si este color aún te parece demasiado "fuerte", pues podemos desplazanos al azul aún más a la izquierda:
B = 255 (se sigue quedando igual)
G = 114 + (255 - 114) * 0,75 = 219
R = 0 + (255 - 0) * 0,75 = 191
En resumen, la función lo que haría seria, para cada color, ver la distancia que le queda hasta 255 y aumentar en un porcentaje de esta distancia (en mi primer ejemplo, la mitad (0.5) y en el segundo, tres cuartas partes del recorrido (0.75).
Nuevo valor = Valor actual + (255 - valor actual) * porcentaje de incremento
Fíjate que si llegaras a ponerlos todos a valor 255 (porcentaje de incremento = 1) entonces tendrías un blanco 100%
Si en vez de aclarar quieres oscurecer, es la misma técnica, pero modificando en un porcentaje las distancias del color original hasta cero.
No se si te he aclarado algo
Disculpa, dónde he puesto
Por lo tanto el 128, 184, 128 seria el color de la parte superior central de la paleta.
Debería decir 128, 184, 255
En el primer color que has puesto en tu pregunta:
Si aplicamos un aclarado al 50% nos resulta
Si tuvieramos un función AclararColor como
Function AclararColor(Valor, Porcentaje)
AclararColor = Valor + (255 - Valor) * Porcentaje/100
End Function
Podrías poner
VRGBTE = RGB (AclararColor(161,50), AclararColor(136,50), AclararColor(127,50))
VRGBTE
Puedo suponer que para oscurecer debo cambiar la función:
Function OscurecerColor(Valor, Porcentaje) OscurecerColor = Valor + (255 - Valor) / Porcentaje/100 End Function
¿Es correcto?
Ahora, da como resultado valores con decimales. He usado Round para convertirlo en un entero. ¿Es relevante usar esto?
Correcto emplear el Round, aunque si la variable donde cargues es resultado es un integer no hace falta.
Respecto a oscurecer, la función sería
NuevoValor = ValorActual - (ValorActual - 0) * porcentaje.
O lo que es lo mismo ValorActual - ValorActual * Porcentaje.
O lo que es lo mismo
valorActual * (1-porcentaje)
Cuando hablamos de porcentaje es en tanto por 1. Es decir el porcentaje dividido por 100.
Function AclararColor(Color, Porcentaje) 'Función que devuelve un color más claro a partir de un color de origen y un porcentaje de aclarado 'Utiliza 2 parámetros: ' - Color: el valor decimal de un color. Si no se tiene el valor decimal, se puede ingresar la función RGB(R,G,B) que calcula este valor decimal ' - Porcentaje: porcentaje de aclarado del color en un intervalo de 0 a 100 'Si el porcentaje es 0 se devuelve el mismo color sin modificarlo 'Si el porcentaje es 100 se devuelve el color blanco Dim MColor(3) As Integer 'Matriz donde almaceno los 3 colores básicos Dim ColorH As String 'Cadena donde cargo el valor hexadecimal del color Dim X As Integer 'Contador para usarlo en un bucle de 3 saltos 'Transformo el valor del color a una cadena Hexadecimel ColorH = Hex(Color) 'Completo la cadena hexadecimal con ceros a la izquiera ColorH = String(6 - Len(ColorH), "0") & ColorH 'Recorro la cadena ColorH hacia atrás de dos en dos para obtener el valor del RGB For X = 6 To 2 Step -2 MColor(X / 2) = Val("&H" & Mid(ColorH, X, 1)) + Val("&H" & Mid(ColorH, X - 1, 1)) * 16 Next X 'Calculo los valores atenuados MColor(1) = MColor(1) + (255 - MColor(1)) * Porcentaje / 100 MColor(2) = MColor(2) + (255 - MColor(2)) * Porcentaje / 100 MColor(3) = MColor(3) + (255 - MColor(3)) * Porcentaje / 100 'Devuelvo el color atenuado AclararColor = RGB(MColor(3), MColor(2), MColor(1)) End Function
Te dejo una función para aclarar los 3 valores de RGB al mismo tiempo
La puedes usar de varias formas, por ejemplo, para un aclarado del 50%...
Me.NombreDelControl.ForeColor = AclararColor(RGB(255,128,33),50)
o
Me.NombreDelControl.ForeColor = RGB(255,128,33)
Me.NombreDelControl.ForeColor = Aclarar(Me.NombreDelControl.ForeColor, 50)
o
MiColor = RGB(255,128,33)
Me.NombreDelControl.ForeColor = Aclarar(MiColor,50)
Si te sirve te puedo hacer la función de oscurecer
Function OscurecerColor(Color, Porcentaje) 'Función que devuelve un color más oscuro a partir de un color de origen y un porcentaje de oscurecimiento 'Utiliza 2 parámetros: ' - Color: el valor decimal de un color. Si no se tiene el valor decimal, se puede ingresar la función RGB(R,G,B) que calcula este valor decimal ' - Porcentaje: porcentaje de oscurecimiento del color en un intervalo de 0 a 100 'Si el porcentaje es 0 se devuelve el mismo color sin modificarlo 'Si el porcentaje es 100 se devuelve el color negro Dim MColor(3) As Integer 'Matriz donde almaceno los 3 colores básicos Dim ColorH As String 'Cadena donde cargo el valor hexadecimal del color Dim X As Integer 'Contador para usarlo en un bucle de 3 saltos 'Transformo el valor del color a una cadena Hexadecimel ColorH = Hex(Color) 'Completo la cadena hexadecimal con ceros a la izquiera ColorH = String(6 - Len(ColorH), "0") & ColorH 'Recorro la cadena ColorH hacia atrás de dos en dos para obtener el valor del RGB For X = 6 To 2 Step -2 MColor(X / 2) = Val("&H" & Mid(ColorH, X, 1)) + Val("&H" & Mid(ColorH, X - 1, 1)) * 16 Next X 'Calculo los valores atenuados MColor(1) = MColor(1) - MColor(1) * Porcentaje / 100 MColor(2) = MColor(2) - MColor(2) * Porcentaje / 100 MColor(3) = MColor(3) - MColor(3) * Porcentaje / 100 'Devuelvo el color atenuado OscurecerColor = RGB(MColor(3), MColor(2), MColor(1)) End Function
Ahí la tienes
- Compartir respuesta