[C] Conversion RGB vers HSV

Voir le sujet précédent Voir le sujet suivant Aller en bas

[C] Conversion RGB vers HSV

Message par Skynyrd777 le Sam 18 Déc 2010 - 22:02

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.

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 !)
avatar
Skynyrd777
Admin

Messages : 216
Date d'inscription : 02/06/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum