RGBtoHSV

basti_help

Grünschnabel
Und zwar brauch ich ein Programm, dass ein Bild einliest dies abspeichert und dann die Farbwerte von einem RGB-Farbraum zu einem HSV-Farbraum umwandelt hab auch schon ein paar teile allerdings fehlt mir da noch weiß allerdings net was (struct?) Vielleicht könnt ihr mir ja weiterhelfen hier der Code übriegens c++
ZUM EINLESEN:
Code:
#include <vcl.h>
#include<iostream.h>
#include<fstream.h>


using namespace std;

int main(int argc, char* argv[])
{
    ifstream *file = new ifstream("BMW.bmp", ios::binary);

    file->seekg(54, ios::beg);    // jump to bmp data, starts at byte 54

    char *buffer = new char[48];
    file->read(buffer, 48);
    for(int i=0; i<48; i++)
        printf("data byte %d = %d\n", i, (unsigned char)buffer[i]);

    file->close();
}
ZUM UMRECHEN:
Code:
#include <math.h>
void HSVtoRGB()
{
    int i;
    float f, p, q, t,hTemp, s, h, r, g, b, v;

    if( s == 0.0 || h == -1.0) // s==0? Totally unsaturated = grey so R,G and B all equal value
    {
      r = g = b = v;
      return;
    }
    hTemp = h/60.0f;
    i = (int)floor( hTemp );                 // which sector
    f = hTemp - i;                      // how far through sector
    p = v * ( 1 - s );
    q = v * ( 1 - s * f );
    t = v * ( 1 - s * ( 1 - f ) );

    switch( i )
    {
    case 0:{r = v;g = t;b = p;break;}
    case 1:{r = q;g = v;b = p;break;}
    case 2:{r = p;g = v;b = t;break;}
    case 3:{r = p;g = q;b = v;break;}
    case 4:{r = t;g = p;b = v;break;}
    case 5:{r = v;g = p;b = q;break;}
    }
}
müssten dann halt noch so als übergabe verbunden werden, dass die Wert vom einlesen an das zum Umrechnen weiter gegeben werden
 
moin


sorry aber das ist wichtig und gehört eigentlich in beide
Nein gehört es nicht. Du fragst schliesslich nciht danach wie man umrechnet, sondern wie man die Funktion einbaut!
Dein andere Thread ist auch schon gelöscht.

Desweiteren halte dich an die Groß und Kleinschreibung!


mfg
umbrasaxum
 
Hi.

1) Seit 1998 heißen die Standardheader "fstream" und "iostream", generell hat kein Standardheader mehr eine .h Endung.

2) Du sagst du willst von RGB in HSV umrechnen, hast aber eine Funktion die sich HSVtoRGB nennt (also genau andersrum)?

3) du legst Speicher mit new[] an, den du nicht ordentlich mit delete[] frei gibst.

4) du mußt natürlich der Funktion erstmal Parameter übergeben und dann mußt du auch das Ergebnis zurückgeben. Z.B.
Code:
void RGBtoHSV (int R, int G, int B, int& H, int& S, int& V) { /* bla bla */ }
 
Ups falscher Code
ZUM UMRECHNEN:
Code:
#include <math.h>

void HSVtoRGB()
{
    int i;
    float f, p, q, t,hTemp, s, h, r, g, b, v;

    if( s == 0.0 || h == -1.0) // s==0? Totally unsaturated = grey so R,G and B all equal value
    {
      r = g = b = v;
      return;
    }
    hTemp = h/60.0f;
    i = (int)floor( hTemp );                 // which sector
    f = hTemp - i;                      // how far through sector
    p = v * ( 1 - s );
    q = v * ( 1 - s * f );
    t = v * ( 1 - s * ( 1 - f ) );

    switch( i )
    {
    case 0:{r = v;g = t;b = p;break;}
    case 1:{r = q;g = v;b = p;break;}
    case 2:{r = p;g = v;b = t;break;}
    case 3:{r = p;g = q;b = v;break;}
    case 4:{r = t;g = p;b = v;break;}
    case 5:{r = v;g = p;b = q;break;}
    }
}



        getch();
        return 0;
}

void RGBtoHSV()
 {
    int i;
    float f, p, q, t,hTemp, s, h, r, g, b, v;
    
    float mn=r,mx=r;
    int maxVal=0;

    if (g > mx){ mx=g;maxVal=1;}
    if (b > mx){ mx=b;maxVal=2;}
    if (g < mn) mn=g;
    if (b < mn) mn=b;

    float  delta = mx - mn;

    v = mx;
    if( mx != 0 )
      s = delta / mx;
    else
    {
      s = 0;
      h = 0;
      return;
    }
    if (s==0.0f)
    {
      h=-1;
      return;
    }
    else
    { 
      switch (maxVal)
      {
      case 0:{h = ( g - b ) / delta;break;}         // yel < h < mag
      case 1:{h = 2 + ( b - r ) / delta;break;}     // cyan < h < yel
      case 2:{h = 4 + ( r - g ) / delta;break;}     // mag < h < cyan
      }
    }
 
    h *= 60;
    if( h < 0 ) h += 360;
}
SO der untere ist das was ich brauche
Der Header sind aber bei meinem Borland noch mit.h gekennzeichnet ohne .h erkennt er manche net
SO kannst du mir damit weiterhelfen?
 
was verdammt ich kann nix
Code:
#include <math.h>

void RGBtoHSV()
 {
    int i;
    float f, p, q, t,hTemp, s, h, r, g, b, v;
    
    float mn=r,mx=r;
    int maxVal=0;

    if (g > mx){ mx=g;maxVal=1;}
    if (b > mx){ mx=b;maxVal=2;}
    if (g < mn) mn=g;
    if (b < mn) mn=b;

    float  delta = mx - mn;

    v = mx;
    if( mx != 0 )
      s = delta / mx;
    else
    {
      s = 0;
      h = 0;
      return;
    }
    if (s==0.0f)
    {
      h=-1;
      return;
    }
    else
    { 
      switch (maxVal)
      {
      case 0:{h = ( g - b ) / delta;break;}         // yel < h < mag
      case 1:{h = 2 + ( b - r ) / delta;break;}     // cyan < h < yel
      case 2:{h = 4 + ( r - g ) / delta;break;}     // mag < h < cyan
      }
    }
 
    h *= 60;
    if( h < 0 ) h += 360;
}
 
Also in dem Fall würde ich die Funktion so deklarieren:
Code:
void RGBtoHSV (float r, float g, float b, float& h, float& s, float& v);
(Dann mußt du die entsprechenden Variablen-Deklarationen in der Funktion selbst natürlich entfernen.)

Und so dann aufrufen:
Code:
float r, g, b, h, s, v;

/* hier die Variablen r, g, b mit Werten füllen */

RGBtoHSV(r, g, b, h, s, v);

/* das Ergebnis ist nun in den Variablen h, s, v */
 

Neue Beiträge

Zurück