Bonsoir tout le monde. Pour les besoins d'un cours il me faudrait un programme qui puisse associer de manière empirique des valeurs RVB à une longueur d'onde. J'ai donc trifouillé sur internet et trouvé un script en python. que voici :
Cliquez pour révéler
Cliquez pour masquer
def wav2RGB(wavelength):
w = int(wavelength)
# colour
if w >= 380 and w < 440:
R = -(w - 440.) / (440. - 350.)
G = 0.0
B = 1.0
elif w >= 440 and w < 490:
R = 0.0
G = (w - 440.) / (490. - 440.)
B = 1.0
elif w >= 490 and w < 510:
R = 0.0
G = 1.0
B = -(w - 510.) / (510. - 490.)
elif w >= 510 and w < 580:
R = (w - 510.) / (580. - 510.)
G = 1.0
B = 0.0
elif w >= 580 and w < 645:
R = 1.0
G = -(w - 645.) / (645. - 580.)
B = 0.0
elif w >= 645 and w <= 780:
R = 1.0
G = 0.0
B = 0.0
else:
R = 0.0
G = 0.0
B = 0.0
# intensity correction
if w >= 380 and w < 420:
SSS = 0.3 + 0.7*(w - 350) / (420 - 350)
elif w >= 420 and w <= 700:
SSS = 1.0
elif w > 700 and w <= 780:
SSS = 0.3 + 0.7*(780 - w) / (780 - 700)
else:
SSS = 0.0
SSS *= 255
return [int(SSS*R), int(SSS*G), int(SSS*B)]
Que j'ai traduit ainsi en c#
Cliquez pour révéler
Cliquez pour masquer
wavelenght.Text = Convert.ToString(Math.Floor(slider1.Value));
int lenght = Convert.ToInt16(wavelenght.Text);
double atenuation = 0;
if (lenght >= 380 && lenght <= 420)
{
atenuation = 0.3 + 0.7 * (lenght - 380) / (440 - 380);
}
if (lenght >= 420 && lenght <= 700)
{
atenuation = 1;
}
if (lenght >= 700 && lenght <= 780)
{
atenuation = 0.3 + 0.7 * (750 - lenght) / (750 - 645);
}
if (lenght >= 380 && lenght <= 440)
{
Red.Value = (((-(lenght - 440) / (440 - 380)) *atenuation ) * 255);
Green.Value = 0;
Blue.Value = 1 * atenuation * 255;
}
if (lenght >= 440 && lenght <= 490)
{
Red.Value = 0;
Green.Value = ((lenght - 440) / (490 - 440)) * 255;
Blue.Value = 255 * atenuation;
}
if (lenght >= 490 && lenght <= 510)
{
Red.Value = 0;
Green.Value = 0;
Blue.Value = (-1* lenght + 510) / (510 - 490) * 255;
}
if (lenght >= 510 && lenght <= 580)
{
Red.Value = ((lenght - 510) / (580 - 510)) * atenuation * 255;
Green.Value = 255 * atenuation;
Blue.Value = 0;
}
if (lenght >= 580 && lenght <= 645)
{
Red.Value = 255 * atenuation;
Green.Value = ((-1*lenght + 645) / (645 - 580)) * 255;
Blue.Value = 0;
}
if (lenght >= 645 && lenght <= 780)
{
Red.Value = 1 * atenuation * 255;
Green.Value = 0;
Blue.Value = 0;
}
mySolidColorBrush.Color = Color.FromRgb(Convert.ToByte(Red.Value), Convert.ToByte(Green.Value), Convert.ToByte(Blue.Value));
Et la c'est le drame absolu. Le fondu de départ aux alentours des 380nm ne correspond pas du tout, j'ai un gros trou entre 490 et 510 nm ( Erreur : Non numérique ), un passage éclair sur le jaune à 580 et des couleurs figées qui ne tiennent pas compte de la variable atenuation ...
C'est pourquoi je fais appel à vous pour m'aider dans ma quête de solution :)
Merci d'avance à vous je vais encore essayer de creuser un peu et je reviendrais voir par ici.
Bonne soirée :D