Republic of Computing - Forum
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -35%
-35% sur la machine à café Expresso ...
Voir le deal
359.99 €

[C] Conversion RGB vers HSV

Aller en bas

[C] Conversion RGB vers HSV Empty [C] Conversion RGB vers HSV

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

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

Revenir en haut Aller en bas

Revenir en haut


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