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

Respuesta
1

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas