Dado un valor RGB, como 168, 0, 255
, ¿cómo creo tintes (lo hago más claro) y sombras (lo hago más oscuro) del color?
Dado un valor RGB, como 168, 0, 255
, ¿cómo creo tintes (lo hago más claro) y sombras (lo hago más oscuro) del color?
Respuestas:
Entre varias opciones para sombrear y teñir:
Para tonos, multiplique cada componente por 1/4, 1/2, 3/4, etc., de su valor anterior. Cuanto menor sea el factor, más oscuro será el tono.
Para tintes, calcule (255 - valor anterior), multiplique eso por 1/4, 1/2, 3/4, etc. (cuanto mayor sea el factor, más claro será el tinte), y sume eso al valor anterior (asumiendo cada .component es un número entero de 8 bits).
Tenga en cuenta que las manipulaciones de color (como tintes y otros sombreados) deben realizarse en RGB lineal . Sin embargo, es poco probable que los colores RGB especificados en documentos o codificados en imágenes y video estén en RGB lineal, en cuyo caso es necesario aplicar la denominada función de transferencia inversa a cada uno de los componentes del color RGB. Esta función varía con el espacio de color RGB. Por ejemplo, en el espacio de color sRGB (que se puede asumir si se desconoce el espacio de color RGB), esta función es aproximadamente equivalente a elevar cada componente de color sRGB (que va de 0 a 1) a una potencia de 2,2. (Tenga en cuenta que "RGB lineal" no es un espacio de color RGB).
Consulte también el comentario de Violet Giraffe sobre la "corrección de gamma".
Dependiendo de su modelo de color, existen diferentes métodos para crear un color más oscuro (sombreado) o más claro (teñido):
RGB
:
A la sombra:
newR = currentR * (1 - shade_factor)
newG = currentG * (1 - shade_factor)
newB = currentB * (1 - shade_factor)
Para teñir:
newR = currentR + (255 - currentR) * tint_factor
newG = currentG + (255 - currentG) * tint_factor
newB = currentB + (255 - currentB) * tint_factor
De manera más general, el color que resulta en superponer un color RGB(currentR,currentG,currentB)
con un color RGBA(aR,aG,aB,alpha)
es:
newR = currentR + (aR - currentR) * alpha
newG = currentG + (aG - currentG) * alpha
newB = currentB + (aB - currentB) * alpha
donde (aR,aG,aB) = black = (0,0,0)
sombrear y (aR,aG,aB) = white = (255,255,255)
teñir
HSV
o bien HSB
:
Value
/ Brightness
o aumentar elSaturation
Saturation
o aumentar Value
/Brightness
HSL
:
Lightness
Lightness
Existen fórmulas para convertir de un modelo de color a otro. Según su pregunta inicial, si está dentro RGB
y desea usar el HSV
modelo para sombrear, por ejemplo, puede simplemente convertir a HSV
, hacer el sombreado y volver a convertir a RGB
. Las fórmulas para convertir no son triviales, pero se pueden encontrar en Internet. Dependiendo de su idioma, también podría estar disponible como función principal:
RGB
tiene la ventaja de ser realmente simple de implementar, pero:
HSV
o HSB
es algo complejo porque necesitas jugar con dos parámetros para obtener lo que quieres ( Saturation
& Value
/Brightness
)HSL
es lo mejor desde mi punto de vista:
50%
significa un tono inalterado>50%
significa que el tono es más claro (tinte)<50%
significa que el tono es más oscuro (sombra)Lightness
pieza)Actualmente estoy experimentando con lienzos y píxeles ... Estoy descubriendo que esta lógica me funciona mejor.
agregar para compensar el valor de 'tinte'
var grey = (r + g + b) / 3;
var grey2 = (new_r + new_g + new_b) / 3;
var dr = grey - grey2 * 1;
var dg = grey - grey2 * 1
var db = grey - grey2 * 1;
tint_r = new_r + dr;
tint_g = new_g + dg;
tint_b = new_b _ db;
o algo así...
rs = r * 0.25
,gs = g * 0.25
,bs = b * 0.25
(que es un tono bastante oscuro); Tint (rt, gt, bt):rt = r + (0.25 * (255 - r))
,gt = g + (0.25 * (255 - g))
,bt = b + (0.25 * (255 - b))
(que es un tinte bastante luz). Lo hice como parte de una variedad genial que creó muchos tonos y funcionó muy bien. Espero que ayude. Gracias Peter.