RGBtoHSV

Ja, das macht ja nix. Wenn du die Datei ausliest füllst du die Variablen r, g, b mit den ausgelesenen Werten, rufst die Funktion auf und gibst dann das Ergebnis in eine andere Datei aus.
 
Hi. Bist du denn schon weitergekommen bzw. haste was gefunden? Kannst du denn wenigstens ein paar Annahmen treffen (z.B. welche Farbtiefe deine Bitmaps haben)? Ich hab ja schon gesehen, das du annimmst das die Bitmap Daten bei Byte 54 anfangen, das ist ja keineswegs immer so. Woher weisst du das denn?

Also wenn das biCompression Feld des Bitmaps auf BI_RGB gesetzt ist und die Farbtiefe 24bpp beträgt ist es eigentlich ziemlich einfach, dann stehen die Daten für ein Pixel hintereinander in 3 Bytes jeweils eins für R, G, B. Dann kann man (soweit ich das verstehe) ungefähr so vorgehen:
Code:
unsigned char byte;
float r, g, b;

while (true) {
  if (file >> byte) r = byte;
  else break;
  if (file >> byte) g = byte;
  else break;
  if (file >> byte) b = byte;
  else break;
  if (!file >> byte) break; /* ein Byte muß man überlesen, da auf 4 Byte ausgerichtet ist */
  
  RGBtoHSV (r, g, b, h, s, v);
}

Hab's allerdings nicht getestet (ich weiß ja nun auch nicht was für Bitmaps du hast). Wenn irgendwas falsch ist, wird mich sicher jemand verbessern.
 
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!
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;
}
 
Hi.

Wo haste denn die Funktionen "ReadBmp" und "WriteBmp" her? Sind die in der Borland VCL dabei? Also mit Google find ich irgendwie nix.

Je nach dem wo du's her hast, kannst du ja evtl. auch an der gleichen Stelle Beispielcode oder Dokumentation wie man das dann benutzt finden(?).
 
Zurück