[C] Conversion RGB vers HSV
Republic of Computing - Forum :: Programmation :: Programmation algorithmique :: Banque d'algorithmes
Page 1 sur 1
[C] Conversion RGB vers HSV
Voici un algorithme en C permettant de convertir une couleur exprimée en standard colorimétrique RGB vers le standard HSB (ou TSL, Teinte, Saturation, Luminosité). Plus d'informations sur ces standards sur cette page. Les valeurs d'entrées sont trois entiers compris entre 0 et 255 inclus et le résultats est trois entiers sur le même ensemble (pour une application binaire aisée). Il y a perte de donnée sur la teinte puisque celle ci est habituellement stockée dans [0;360[ (le cercle colorimétrique) et pas mal de place sur la luminosité et saturation (ce sont habituellement des pourcentages).
Notons que l'algorithme passe par des flottants entre 0 et 1 pour toutes les valeurs à l'exception de la teinte, il est facile de supprimer l'arrondi sur 255.
PS. Je tiens à m'excuser pour mon absence prolongée du forum : trop de travail en spé math ! Je vais essayer de venir un peu durant les vacances, en particulier pour vous présenter un gros projet algorithmique : des algorithmes de dessin de fractales de Mandelbrot et de Julia ! (d'où mon intérêt pour le C et les standards colorimétriques !)
Notons que l'algorithme passe par des flottants entre 0 et 1 pour toutes les valeurs à l'exception de la teinte, il est facile de supprimer l'arrondi sur 255.
- Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
// RGB
double r=128; // [0/255]
double g=11; // [0/255]
double b=0; // [0/255]
// HSV
double h=0; // [0;360[
double s=0; // [0;1]
double v=0; // [0;1]
// max et min
r=r/255;
g=g/255;
b=b/255;
double max; // [0;1]
double min; // [0;1]
if(r>=g && r>=b){max=r;}
if(g>=r && g>=b){max=g;}
if(b>=r && b>=g){max=b;}
if(r<=g && r<=b){min=r;}
if(g<=r && g<=b){min=g;}
if(b<=r && b<=g){min=b;}
// teinte
if(max==min){h=0;}
else
{
if(max==r)
{
h=floor((60*((g-b)/(max-min))+360)/360);
}
else
{
if(max==g)
{
h=60*((b-r)/(max-min))+120;
}
else
{
if(max==b)
{
h=60*((r-g)/(max-min))+240;
}
}
}
}
h=floor((h/360)*255);
// saturation
if(max==0){s=0;}
else
{
s=255*(1-min/max);
}
// luminosité
v=max*255;
printf("%f\n",h);
printf("%f\n",s);
printf("%f\n",v);
return 0;
}
PS. Je tiens à m'excuser pour mon absence prolongée du forum : trop de travail en spé math ! Je vais essayer de venir un peu durant les vacances, en particulier pour vous présenter un gros projet algorithmique : des algorithmes de dessin de fractales de Mandelbrot et de Julia ! (d'où mon intérêt pour le C et les standards colorimétriques !)
Skynyrd777- Admin
- Messages : 216
Date d'inscription : 02/06/2010
Republic of Computing - Forum :: Programmation :: Programmation algorithmique :: Banque d'algorithmes
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum