Le mélange de deux couleurs "naturellement" en javascript
le problème: je veux mélanger deux couleurs en javascript, et obtenir la couleur de résultat. Il ya beaucoup de question similaire sur donc, mais je ne trouve rien qui fonctionne réellement correctement. Je sais que le mélange de deux couleurs différentes (pigments) et des lumières donnera des résultats très différents ( http://en.wikipedia.org/wiki/Color_mixing ).
Voici les questions et les solutions suggérées que j'ai déjà vu, et essayé de mettre en œuvre:
1: mélange de deux vecteurs de couleur RGB pour obtenir la résultante
Donc, mélanger les couleurs en RGB. J'ai mis en œuvre et, dans certains cas, il fonctionne dans certains cas, il n'est pas.
exemple de travail: mélange red
avec yellow
- > orange
. Grand!
http://jsbin.com/afomim/1/edit
ne fonctionne pas exemple: mélange blue
avec yellow
- > gray
. Pas si grand! :)
http://jsbin.com/afomim/5/edit
Je sais qu'en RGB, mélanger blue
avec yellow
ne fera jamais green
, et je comprends pourquoi.
nous ne trouverons pas la réponse ici, allons de l'avant.
2: ajouter des couleurs (couleurs) ensemble comme la peinture (bleu + jaune = vert, etc)
essayons de travailler avec les valeurs CMJN comme suggéré dans cette discussion. Le mélange cyan
avec yellow
donne green
:
http://jsbin.com/igaveg/1/edit
mais le mélange blue
avec yellow
donne black
.
http://jsbin.com/igaveg/2/edit - > ne fonctionne pas!
3: comment mélanger les couleurs "naturellement" avec C#?
Une question très similaire. La réponse la plus contestée suggère de convertir les couleurs en LAB, et cette solution semble prometteuse.
Alors j'ai converti mes couleurs en labo. L'algo de conversion est correct, je l'ai testé!
http://jsbin.com/oxefox/1/edit
maintenant j'ai les deux couleurs en labo, mais comment les mélanger?
NOTE je sais que probablement Je ne trouverai pas une algo qui mélange blue
avec yellow
et donnera le parfait green
, mais j'espère que je peux générer quelque chose semblable au vert :)
8 réponses
j'ai consacré 3-4 jours à cette question. C'est un problème très complexe.
Voici ce que vous pouvez faire si vous voulez mélanger deux couleurs "naturellement":
-
CMJN mixage: ce n'est pas la solution parfaite, mais si vous avez besoin d'une solution maintenant, et que vous ne voulez pas passer des mois à apprendre sur le sujet, expérimenter et coder, vous pouvez vérifier: https://github.com/AndreasSoiron/Color_mixer
-
la mise en Œuvre de la Kubelka-Munk théorie. J'ai passé beaucoup de temps à le lire et à essayer de le comprendre. Ce devrait être la voie à suivre si vous voulez une solution professionnelle, mais il a besoin de 6 paramètres (comme la réflectance, l'absorption, etc. pour chaque couleur que vous voulez mélanger. Avoir R, G, B n'est pas suffisant. Mettre en œuvre la théorie n'est pas difficile, mais obtenir ces paramètres dont vous avez besoin sur chaque couleur semble être la partie manquante. Si vous comprendre comment pour le faire, faites-moi savoir:)
-
Expérimental: vous pouvez faire quelque chose ce que les développeurs de l'application ipad: papier ont fait. Ils ont sélectionné manuellement 100 paires de couleurs populaires et les yeux-testé comment ils devraient se fondre. En savoir plus ici .
je vais personnellement mettre en œuvre le mélange CMJN pour le moment, et peut-être plus tard, si j'ai le temps, je vais essayer de faire quelque chose comme les gars de Fiftythree. Va voir :)
le modèle de couleur RYB pourrait être un choix approprié pour les calculs de mélange de couleurs. Selon Wikipedia , il est principalement utilisé dans l'enseignement de l'art et du design, en particulier la peinture.
pour mélanger 2 couleurs, on convertit les deux couleurs de RGB à RYB, mélange les couleurs en ajoutant chaque color component, et convertit la couleur résultante de RYB en RVB.
j'ai essayé ceci en utilisant le Online Color Mixing Tool , et les résultats sont
-
0000FF ( bleu ) mélangé à #FFFF00 ( jaune ) donne # 008000 ( vert foncé ),
-
FF0000 ( rouge ) mélangé à #FFFF00 ( jaune ) donne #FFA000 ( orange ).
ainsi cette méthode produit exactement les résultats que vous attendiez.
malheureusement, je n'ai pas pu trouver de référence avec la formule "prêt à l'emploi" pour passer de RGB à RYB et de nouveau à RGB.
le papier Inspiré de la Peinture de Mélange de Couleur et de Composition pour la Visualisation - Gossett et Chen décrit l'idée générale du modèle de couleur RYB dans la section " 2 atteindre la couleur INTUITIVE MÉLANGE."
selon ce papier, la conversion de RYB en RGB est faite par interpolation trilinéaire .
la partie difficile est la conversion de RGB en RYB, parce qu'elle nécessite l'inversion de l'interpolation trilinéaire. Voir Conversion entre les espaces de couleurs RGB et RYB pour plus plus d'informations.
même si cette réponse ne fournit pas la formule complète pour la calcul, j'espère que cela donne quelques idées sur la façon de procéder.
avec les couleurs de CIELAB, vous avez trois coordonnées pour chacune de vos deux couleurs dans L'espace couleur LAB. (En passant, excellent travail à ce jour). Ce qui fonctionnera le mieux et sera le plus facile à mettre en œuvre pour vous, c'est de trouver le point médian tridimensionnel d'un segment de ligne imaginaire joignant les deux points dans L'espace de laboratoire. Vous pouvez le faire facilement en faisant la moyenne de chacun des composants de vos deux couleurs: la moyenne L
, moyenne a
et moyenne b
. Puis de les convertir cette couleur retourne dans l'espace RVB en inversant votre transformation (assurez-vous que votre espace d'éclairage reste le même dans les deux sens).
votre nouvelle couleur peut être en dehors de l'espace de couleur RGB. Vous pouvez décider de clipper à la couleur visible la plus proche dans ce cas. (Les bleus y sont particulièrement vulnérables).
maintenant que vous avez vos deux couleurs au format LAB (ou L*a*b*), vous pouvez les comparer ensemble.
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
vous le saviez déjà, Non? parce que c'est ce que vous faisiez avec vos couleurs RGB en moyenne.
j'ai en fait rencontré le même problème en essayant de mélanger 2 couleurs RGB ensemble. Ces deux fonctions ont fonctionné pour moi:
//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+")";
}
pour mélanger le rouge ( [255,0,0] ) avec le bleu ( [0,0,255] ) uniformément, vous pouvez appeler
colorMixer([255,0,0], [0,0,255], 0.5);//returns "rgb(127,0,127)" (purple)
cela peut aider, bien que vous devez convertir chaque valeur de couleur en un tableau d'abord. Si vous utilisez du tissu.js pour travailler avec des éléments de toile, cela devient vraiment facile. Il suffit d'appeler
var rgbA = new fabric.Color(yourColor);
var rgbB = new fabric.Color(yourSecondColor);
alors appelez
colorMixer(rgbA.getSource(),rgbB.getSource(),0.5);
Espère que ces fonctions d'aide.
voici un bon article que j'ai écrit sur le mélange des couleurs dans L'espace-couleur CIE-LCh, qui produit un mélange qui préserve la teinte, la saturation, et la luminance d'une manière qui compatible avec la perception de votre oeil.
vous devez utiliser CMY ou RGB Modèle Couleur.
pourquoi Blue
+ Yellow
ne peut pas être Gray
?
Blue
+ Yellow
= ( Cyan
+ Magenta
) + Yellow
=> Gray
. Pourquoi pas?
donc vous pouvez utiliser RGB (CMY) pour mélanger les couleurs.
Que diriez-vous de convertir RVB En CMYK en utilisant ce et puis:
// 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;
et finalement convertir CMYK en RVB en utilisant ce