Mezcla de dos colores "naturalmente" en javascript


El problema: Quiero mezclar dos colores en javascript, y obtener el color del resultado. Hay un montón de preguntas similares en lo QUE, sin embargo, no encuentro nada que realmente funciona correctamente. Sé que mezclar dos pinturas de diferentes colores (pigmentos) y luces dará resultados muy diferentes ( http://en.wikipedia.org/wiki/Color_mixing).

Aquí están las preguntas y las soluciones sugeridas que ya he visto y tratado de implementar:

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

Ejemplo de trabajo: Mezclando red con yellow -> orange. Genial!
http://jsbin.com/afomim/1/edit

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

No vamos a encontrar la respuesta aquí, vamos a seguir adelante.

2: Agregar Colores (Colores) Juntos como Pintura (Azul + Amarillo = Verde, etc)

Tratemos de trabajar con 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 resultados en black.
http://jsbin.com/igaveg/2/edit -> No ¡trabajando!

3: Cómo mezclar colores "naturalmente" con C#?
Una pregunta muy similar. La respuesta más votada sugiere convertir colores a LABORATORIO, y esta solución parece prometedora.
Así que convertí mis colores en LABORATORIO. La conversión algo es correcta, lo probé!

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

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

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

Author: Community, 2013-02-11

8 answers

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

Esto es lo que puede hacer si desea mezclar dos colores "naturalmente":

  1. Mezcla CMYK: no es la solución perfecta, pero si necesitas una solución ahora, y no quieres pasar meses aprendiendo sobre el tema, experimentando y codificando, puedes ver esto: https://github.com/AndreasSoiron/Color_mixer

  2. Implementando la teoría Kubelka-Munk. Pasé mucho de tiempo leyendo sobre ello, y tratando de entenderlo. Este debería ser el camino a seguir si quieres 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 averiguas cómo hacerlo, házmelo saber :)

  3. Experimental: se puede hacer algo que los desarrolladores de la aplicación para ipad: Papel han hecho. Seleccionaron manualmente 100 pares de colores populares y probaron cómo debían mezclarse. Obtenga más información al respecto aquí.

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

 29
Author: Tamás Pap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-20 23:24:06

El Modelo de color RYB podría ser una opción adecuada para los cálculos de mezcla de colores. De acuerdo con Wikipedia , se utiliza principalmente en el arte y la educación del diseño, particularmente en la pintura.

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

He intentado esto usando la Herramienta de Mezcla de color 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).

Así que este método produce exactamente los resultados que esperabas.

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

El papel Mezcla y Composición de Colores Inspirados en la Pintura para la Visualización - Gossett y Chen describe la idea general del modelo de color RYB en la sección "2 LOGRAR UNA MEZCLA DE COLOR INTUITIVA".

De acuerdo con ese documento, la conversión de RYB a RGB se realiza mediante 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. Ver Conversión entre RGB y color RYB espacios para más información.

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

 12
Author: Martin R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:32:34

Con CIELAB colors tienes tres coordenadas para cada uno de tus dos colores en el espacio de color LAB. (Por cierto, excelente trabajo en llegar hasta aquí). 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 de LABORATORIO. Puede hacer esto fácilmente promediando cada uno de los componentes de sus dos colores: el promedio L, el promedio a y el promedio b. A continuación, convertir este color de nuevo en espacio RGB al invertir su transformación (asegúrese de que su espacio de iluminación permanezca igual en ambos sentidos).

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

 4
Author: Plynx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-11 19:20:54

Ahora que tienes tus dos colores en formato LAB (o L*a*b*), puedes 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

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

 3
Author: Quuxplusone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-11 19:20:10

En realidad me encontré con el mismo problema al tratar de mezclar 2 colores RGB juntos. 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]) uniformemente, 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 usas tela.js para trabajar con elementos de canvas, esto se vuelve muy fácil. Simplemente llame

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

Luego llama

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

Espero que estas funciones ayuden.

 3
Author: Aaron Harris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-23 20:15:50

Aquí hay 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 que sea coherente con la percepción de su ojo.

Mezcla de colores mejorada

 1
Author: Stu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-28 22:43:44

Necesitas 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 esto.

Así que puedes usar RGB (CMY) para mezclar colores.

 0
Author: Pylyp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-10 08:55:02

¿Qué hay de convertir RGB a CMYK usando este 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 convertir CMYK a RGB usando este

 0
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 09:30:41