simple darken color javascript math colors color-scheme

javascript - darken - select color js



Mezcla de dos colores "naturalmente" en javascript (8)

¿Qué hay de convertir RGB a CMYK usando this y luego:

// CMYK colors colorA = [2, 90, 94, 0]; colorB = [4, 0, 80, 0]; colorMixC = (colorA[0] + colorB[0]) / 2; colorMixM = (colorA[1] + colorB[1]) / 2; colorMixY = (colorA[2] + colorB[2]) / 2; colorMixK = (colorA[3] + colorB[3]) / 2;

Y finalmente convierta CMYK a RGB usando this

El problema: quiero mezclar dos colores en javascript y obtener el color del resultado. Hay muchas preguntas similares en SO, sin embargo, no encuentro nada que realmente funcione correctamente. Sé que mezclar dos pinturas de diferentes colores (pigmentos) y luces dará resultados muy diferentes ( http://en.wikipedia.org/wiki/Color_mixing ).

Estas son las preguntas y soluciones sugeridas que ya he visto, y traté de implementar:

1: mezcla de dos vectores de color RGB para obtener resultados
Por lo tanto, mezclar colores en RGB. Lo implementé, y en algunos casos funciona en algunos casos, no.

Ejemplo de trabajo: mezclar red con yellow -> orange . ¡Estupendo!
http://jsbin.com/afomim/1/edit

Ejemplo que no funciona: mezclar blue con yellow -> gray . ¡No muy bien! :) http://jsbin.com/afomim/5/edit
Sé que en RGB mezclar blue con yellow nunca volverá green , y entiendo por qué.

No encontraremos la respuesta aquí, sigamos adelante.

2: Adición de colores (colores) juntos como pintura (azul + amarillo = verde, etc.)

Tratemos de trabajar con los valores CMYK como se sugiere en esta discusión. Mezclar cyan con yellow da green :
http://jsbin.com/igaveg/1/edit
pero mezclar blue con yellow da como resultado black .
http://jsbin.com/igaveg/2/edit -> ¡No funciona!

3: ¿Cómo mezclar colores "naturalmente" con C #?
Una pregunta muy similar. La respuesta más votada sugiere la conversión de colores a LAB, y esta solución parece prometedora.
Así que convertí mis colores a LAB. ¡El algoritmo de conversión es correcto, lo probé!

http://jsbin.com/oxefox/1/edit

Ahora tengo los dos colores en LAB, ¿pero cómo mezclarlos?

NOTA Sé que probablemente no encontraré un algo que mezcle blue con yellow y le dará el green perfecto, pero espero que pueda generar algo similar al verde :)


Ahora que tiene sus dos colores en formato LAB (o L * a * b *), puede promediarlos juntos.

L(result) = L(first color) + L(second color) / 2 A(result) = A(first color) + A(second color) / 2 B(result) = B(first color) + B(second color) / 2

Usted ya sabía esto, ¿verdad? porque esto es lo que estabas haciendo con tus colores RGB originales para promediarlos.


Con los colores CIELAB tiene tres coordenadas para cada uno de sus dos colores en el espacio de color LAB. (Por cierto, excelente trabajo para llegar tan lejos). Lo que funcionará mejor y será más fácil de implementar para usted es encontrar el punto medio tridimensional de un segmento de línea imaginaria que une los dos puntos en el espacio LAB. Puede hacerlo fácilmente simplemente promediando cada uno de los componentes de sus dos colores: el promedio de L , el promedio de a y el promedio de b . A continuación, conviértalo de nuevo en espacio RGB invirtiendo la transformación (asegúrese de que el espacio de iluminación se mantenga igual en ambos sentidos).

Su nuevo color puede estar fuera del espacio de color RGB. Puede decidir recortar al color visible más cercano en este caso. (Los azules son especialmente vulnerables a esto).


De hecho, me encontré con el mismo problema al intentar mezclar 2 colores RGB. Estas 2 funciones funcionaron para mí:

//colorChannelA and colorChannelB are ints ranging from 0 to 255 function colorChannelMixer(colorChannelA, colorChannelB, amountToMix){ var channelA = colorChannelA*amountToMix; var channelB = colorChannelB*(1-amountToMix); return parseInt(channelA+channelB); } //rgbA and rgbB are arrays, amountToMix ranges from 0.0 to 1.0 //example (red): rgbA = [255,0,0] function colorMixer(rgbA, rgbB, amountToMix){ var r = colorChannelMixer(rgbA[0],rgbB[0],amountToMix); var g = colorChannelMixer(rgbA[1],rgbB[1],amountToMix); var b = colorChannelMixer(rgbA[2],rgbB[2],amountToMix); return "rgb("+r+","+g+","+b+")"; }

Para mezclar rojo ([255,0,0]) con azul ([0,0,255]) de manera uniforme, puede llamar

colorMixer([255,0,0], [0,0,255], 0.5);//returns "rgb(127,0,127)" (purple)

Esto puede ayudar, aunque primero debe convertir cada valor de color en una matriz. Si usa Fabric.js para trabajar con elementos canvas, esto se vuelve realmente fácil. Solo llama

var rgbA = new fabric.Color(yourColor); var rgbB = new fabric.Color(yourSecondColor);

luego llame

colorMixer(rgbA.getSource(),rgbB.getSource(),0.5);

Espero que estas funciones ayuden.


Dediqué 3-4 días a esta pregunta. Es un problema realmente complejo.

Esto es lo que puedes hacer si quieres mezclar dos colores "naturalmente":

  1. Mezclar CMYK: no es la solución perfecta, pero si necesita una solución ahora, y no quiere pasar meses aprendiendo sobre el tema, experimentando y codificando, puede consultar esto: https://github.com/AndreasSoiron/Color_mixer

  2. Implementando la teoría de Kubelka-Munk. Pasé mucho tiempo leyendo sobre ello y tratando de entenderlo. Este debería ser el camino a seguir si desea una solución profesional, pero necesita 6 parámetros (como reflectancia, absorción, etc.) para cada color que desee mezclar. Tener R, G, B no es suficiente. Implementar la teoría no es difícil, pero obtener los parámetros que necesita sobre cada color parece ser la parte que falta. Si descubres cómo hacerlo, házmelo saber :)

  3. Experimental: puedes hacer algo que los desarrolladores de la aplicación ipad: fiftythree.com/paper han hecho. Seleccionó manualmente 100 pares de colores populares y probó cómo se deben combinar. Aprenda más sobre esto here .

Personalmente implementaré la mezcla CMYK por el momento, y tal vez más tarde, si tengo tiempo, trataré de hacer algo como los chicos de Fiftythree. Veremos :)


El modelo de color RYB podría ser una opción adecuada para los cálculos de mezcla de colores. Según Wikipedia , se usa principalmente en la educación de arte y diseño, particularmente pintura.

Para mezclar 2 colores, uno convierte ambos colores de RGB a RYB, mezcla los colores agregando cada componente de color y convierte el color resultante de RYB a RGB.

Lo he intentado con la herramienta de mezcla de colores en línea , y los resultados son

  • 0000FF ( azul ) mezclado con # FFFF00 ( amarillo ) da # 008000 ( verde oscuro ),

  • FF0000 ( rojo ) mezclado con # FFFF00 ( amarillo ) da # FFA000 ( naranja ).

Entonces este método produce exactamente los resultados que esperaba.

Lamentablemente, no pude encontrar una referencia con la fórmula "lista para usar" para convertir de RGB a RYB y volver a RGB.

El artículo Paint Inspired Color Mixing and Compositing for Visualisation - Gossett y Chen describen la idea general del modelo de color RYB en la sección "2 LOGRO DE MEZCLA INTUITIVA DEL COLOR".

De acuerdo con ese documento, la conversión de RYB a RGB se realiza por interpolación trilineal .

La parte difícil es la conversión de RGB a RYB, porque requiere la inversión de la interpolación trilineal. Consulte Conversión entre espacios de color RGB y RYB para obtener más información.

Incluso si esta respuesta no proporciona una fórmula completa para el cálculo, espero que brinde algunas ideas sobre cómo proceder.


Este es un buen artículo que escribí sobre la mezcla de colores en el espacio de color CIE-LCh, que produce una mezcla que conserva el tono, la saturación y la luminancia de una manera consistente con la percepción de su ojo.

Mezcla de color mejorada


Necesita usar el modelo de color CMY o RGB .

¿Por qué Blue + Yellow no puede ser Gray ?

Blue + Yellow = ( Cyan + Magenta ) + Yellow => Gray . Por qué no?

Mira este.

Entonces puede usar RGB (CMY) para mezclar colores.