RGB-Farben zu HSV-Farben umrechnen
-
sollte eigentlich Consolen basiert sein!!!
-
Hallo
geh ins Menü Datei/Neu, dort im Dialog wählst du den Konsolenexperten aus.
Im nächsten Dialog deaktivierst du noch "VCL verwenden" und "Multi-Threads", danach nochmal OK.Dann kannst du dein Konsolenprogramm schreiben.
Dazu lies dir am besten Tutorials durch, siehe der Link Tutorials auf dieser Seite im Menü oben rechts.bis bald
akari
-
Hallo,
Dann solltest du dein Projekt mit Hilfe des Konsolenesperten mal neu erstellen. Also Projekt/Neu
dann den Konsolenexperten wählen. Das Häkchen bei "VCL verwenden" wegmachen. Dann hast du deine int main
So eine Frage gehört aber eher in das BCB-Forum.[edit]zu spät
[edit]
Ciao
-
-
bitte
zuerst googlen
wenn nicht fundig dann WIKI_rulez aufrufenund da finden wir was bei wikipedia?
Transformation von RGB in HSV
Hat man die (R, G, B)-Werte einer Farbe, wobei R, G, and B Werte zwischen 0,0 und 1,0 annehmen können, können die (H, S, V) Werte errechnet werden:
MAX = max(R,G,B)
MIN = min(R,G,B)
H = \left\{ \begin{matrix} \left( 0 + \frac {G - B} {MAX - MIN} \right) \times 60, & \mbox{if } R = MAX \\ \left( 2 + \frac {B - R} {MAX - MIN} \right) \times 60, & \mbox{if } G = MAX \\ \left( 4 + \frac {R - G} {MAX - MIN} \right) \times 60, & \mbox{if } B = MAX \end{matrix}\right.
if(H < 0)
H = H + 360
S = \frac {MAX - MIN} {MAX}
V = MAX
Der resultierende Wert von H variiert zwischen 0,0 und 360,0, S und V zwischen 0,0 und 1,0.
Beachte, dass diese Formeln einige Eigenheiten der HSV-Werte widerspiegeln:
Wenn MAX = MIN (S = 0), dann ist H undefiniert.
Das ist offensichtlich, wenn man die Diagramme oben betrachtet, denn wenn S = 0 ist, dann liegt die Farbe auf der zentrale Grau-Linie, sodass der Farbton selbstverständlich ohne Bedeutung ist.
-
Hab bei wikipedia das gleiche gefunden gehabt allerdings hat es mir nur soweit geholfen wie in meinen ersten Bsp.!!!
Hab aber mitlerweile noch was neues schauts euch mal an vieleicht bekommt ihr das zu m laufen!!!;)#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;} } } return 0; }
-
Dein zuerst genannter Fehler hat aber eigentlich nichts mit der Umrechnung zu tun. Hast du akaris und mein Post gelesen?
Woher nimmt deine Funktion denn die HSV-Werte und wo kommen die RGB-Werte hin?
Man könnte doch hier schön zwei Strukturen verwenden (zum Übergeben und Rückgeben).struct RGB { int R, G, B; };
Die HSV-Struktur dann äquivalent.
-
Hört sich ja ganz gut an was du sagst allerdings hab ich kein plan die Werte müssten von einem Bild eingelesen werden und dann an den Umrechner übergeben werden!!!
#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(); }
Vieleicht so irgendwie und dann halt deine Idee mit meinem vorrigen post vereinen???
#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;} } }
Allerdings weiß ich jetzt net mehr weiter!!! Kann mal einer schaun ob er es hinbekommt!!!
-
Ab nach Projekte würde ich sagen.
-
Kann mir jetzt keiner Helfen?
-
vielleicht solltest du dich erst einmal etwas intensiver mit bitmaps und der farbkonvertierung vertraut machen. du liest hier lediglich ein bild mit 16 farben ein. alles andere funktioniert dann schon mal nicht. da du mit dem bcb arbeitest, könntest du auf TImage bzw. TBitmap zurueckgreifen und dort dein bild laden. Mittels ScanLine-Eigenschaft kannst du dann zeilenweise auf die eigentlichen Bilddaten zugreifen und diese manipulieren. Beispiele findest du in der Hilfe und durch das Suchen im Forum.
folgendes Beispiel zeigt wie ich die werte berechne. rechnet einen RGB-Wert in einen HSV-Wert um. du uebergibst jeweils die einzelnen Farbwerte und jeweils einen zeiger auf die resultierenden hsv-Werte. die funktion bindest du dann zum beispiel in die schleife ein mit der du ueber alle farbwerte des bildes iterierst.
Achtung: HSV ist ein zylindrisches Farbmodell, d.h. du kannst die Werte nicht einfach so wieder ausgeben, sondern musst die werte fuer anzeige-zwecke erst wieder nach RGB transformieren. wenn du damit nur berechnungen anstellen willst, dann natuerlich nicht.
typedef unsigned char u_char; //--------------------------------------------------------------------------- // Funktion konvertiert RGB nach HSV // (H = Hue, S = Saturation, V = Value) // // RGB = [0 .. 255, 0 .. 255, 0 .. 255] // HSV = [0 .. 360, 0 .. 1, 0 .. 1] //--------------------------------------------------------------------------- void RGB_to_HSV(u_char R, u_char G, u_char B, double *H, double *S, double *V) { double dR = (double) R; double dG = (double) G; double dB = (double) B; double _H = 0.0; double _S = 0.0; double _V = Maximum(dR, dG, dB); // Maximum von 3 Werten double Min = Minimum(dR, dG, dB); // Minimum von 3 Werten double Delta = _V - Min; // saturation berechnen if (_V != 0.0) _S = Delta / _V; // hue berechnen if (_S != 0.0) { if (dR == _V) _H = ((dG - dB) * 60.0 / Delta); else if (dG == _V) _H = 120.0 + ((dB - dR) * 60.0 / Delta); else _H = 240.0 + ((dR - dG) * 60.0 / Delta); if (_H < 0.0) _H += 360.0; } *H = _H; *S = _S; *V = _V / 256.0; }
Aufruf:
u_char r = 200; u_char g = 100; u_char b = 250; double h, s, v; // in h, s, v stehen dann die umgerechneten Werte RGB_to_HSV(r, g, b, &h, &s, &v);
auf jeden fall bist du hier im falschen forum und ein mod sollte dich mal verschieben.
-
So ich bin weiter gekommen puhh!
Also mittlerweile kann ich eine Image einlesen und dann wieder speicher
Die Umrechnung von RGB zu HSV hab ich auch drin.Ich weiß bloß nicht wie ich die RGB werte aus der Image bekomme und und dann wieder die HSV in die Image bekomme kann mir da jemand helfen?
Hier mein Code!#include "stdafx.h" #include <iostream> using namespace std; int main() { int x, y; double R, G, B, Max, Min, H, S, V, r, g, b; unsigned char* pData; // read the image bool bSuccess = ReadBmp( "C:/P1000825.bmp", x, y, pData ); if ( bSuccess == false ) { cout << "*Error loading image!*" << endl; return 1; } cout<<"R Wert"; cin>>r; cout<<"G Wert"; cin>>g; cout<<"B Wert"; cin>>b; R = r / 256.0; G = g / 256.0; B = b / 256.0; if(R > G && R > B)Max = R; if(G > R && G > B)Max = G; if(B > G && B > R)Max = B; if(R < G && R < B)Min = R; if(G < R && G < B)Min = G; if(B < G && B < R)Min = B; if(R = Max)H = 0 + (G - B) / (Max - Min); if(G = Max)H = 2 + (B - R) / (Max - Min); if(B = Max)H = 4 + (R - G) / (Max - Min); if(H < 0) H = H + 360; S = (Max- Min) / Max; V = Max; cout<<H<< endl; cout<<S<< endl; cout<<V<< endl; // write the image if ( WriteBmp( "output.bmp", x, y, pData ) == false ) { cout << "*Error writing image!*" << endl; return 1; } fgetchar (); return 0; }