Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 12.05.2004, 21:26 Titel: COLORREF->RGB |
|
|
Was ist denn nun eigentlich die Umkehrung vom folgenden Code zum errechnen eines COLORREF-Werts aus den einzelnen RGB-Werten?
Code: | COLORREF farbe=(((Rot) >> cShiftred) << cPositionred)+
(( (Gruen) >> cShiftgreen) << cPositiongreen)+
(( (Blau) >> cShiftblue) << cPositionblue)); |
Die Umrechung bei der Farbtiefe von 32 Bit funzt einwandfrei. Leider ist das bei 16 Bit nicht so.
Deshalb meine Frage: Wie bekommt man die einzelnen RGB-Werte aus einem COLORREF?
PS: cShiftx und cPositionx sind jeweils wie im Buch definiert.
PPS: Über google find ich nur Blödsinn. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 12.05.2004, 22:25 Titel: |
|
|
Ich bin mir nicht sicher, was du erreichen willst, COLORREF ist einfach ein DWORD. Ich denke das die Farbe dort als A8R8G8B8 gespeichert ist, nie in 16 Bit, bin mir aber nicht sicher. Wie du dass in 16 Bit umrechnest weiss du aber dann? |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 12.05.2004, 22:55 Titel: |
|
|
Ach jezz versteh ich du willst aus dem COLORREF wert wieder die einelnen RGBA Werte haben stimmts ?
Mit GetRValue, GetGValue und GetBValue funktionierts nicht oder ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 13.05.2004, 21:21 Titel: |
|
|
@FallenAngel: Jepp, ich will die einzelnen Werte haben.
Was sind das für Funktionen(GetXValue)? Gibts die auch unter DX8?
@Christian: Du hast doch in JLI1 u. 2 beschrieben, wie man aus den COLORREF-Werten die einzelnen Werte ausrechnen kann. Dabei gibt es eine Fallunterscheidung zwischen einer Farbtiefe von 32 Bit, 24 Bit und 16 Bit.
Bei 32 Bit funktioniert es einwandfrei, doch bei 16 Bit kommt es zu völlig anderen Werten  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 15.05.2004, 21:32 Titel: |
|
|
Christian Rousselle hat Folgendes geschrieben: | Wie du dass in 16 Bit umrechnest weiss du aber dann? |
Genau das ist ja mein Problem ^^  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.05.2004, 22:35 Titel: |
|
|
Tschuldigung, hatte nicht gesehen, dass du geantwortet hattest. Wie ist denn genau das Problem? Bist du sicher, dass in der COLORREF Variablen 16 Bit drin sind oder muss du den 32 Bit-Wert auf 16 runterechnen? Dann muss du wissen, ob es R5G5B5 oder R5G6B5 ist und ensprechend umrechnen, d.h. nicht nur schiften, sondern die 8 Bit auf 5 bzw. 6 umrechnen.
C. |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 16.05.2004, 13:03 Titel: |
|
|
Hmm...ich bin mir nicht sicher, aber ich glaube, die RGB-Werte bleiben in jeder Farbtiefe gleich. COLORREF ist ja eigentlich ein integer. D.h. es müsste eigentlich immer die selbe Bit-/Byte-Menge (32Bit/4Byte) in einem COLORREF gespeichert sein.
Aber bei z.B. 32-Bit Farbtiefe geht das Umrechnen ja einfach durch einmal um 8 Bit shiften und einem 16 Bit(weiß gerade nicht mehr, ob << oder >>).
Mein Problem ist, das jetzt bei 16 Bit Farbtiefe zu machen.
Du hast ja in den Büchern beschrieben, wie man bei 16 Bit 3 RGB-Werte in einen COLORREF hineinbringt. Dazu muss man doch am Anfang des Programms irgendwelche Shiftmasken, etc... ausrechnen(d.h. 666 und 656 sollten auch berücksichtigt werden).
Bloß mir fehlt jetzt die Umkehrung. In den Büchern steht nämlich nicht, wie man bei 16Bit einen COLORREF in die drei RGBs aufsplittet. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.05.2004, 06:54 Titel: |
|
|
Dürfte das nicht das gleiche sein denn in allen Fällen wird ja der DWORD Typ genutzt. Deshalb sollten die GetXValue Funktionen auch da noch funktionieren wo mit 16Bit farbwerten gearbeitet wird. Wenn nicht dann musste dir die Funktionen nur ein wenig anpassen.
In DX siond die nicht mit dabei sodnern glaube nur in der WinSDK. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.05.2004, 12:42 Titel: |
|
|
Also berücksichtigen diese GetXValue() die Farbtiefe?
Aber sind die Funktionen auch schnell?
Und welche Header muss ich da includieren? Einfach windows.h? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.05.2004, 13:01 Titel: |
|
|
Im Grunde dürften die Funktionen nur die inverse version der D3DCOLOR_XRGB,... makros sein also müssten sie recht schnell sein. windows.h muss includiert werden. Oder du siehst dir das hier an:
Code: |
#define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) ((BYTE)((rgb) >> 16))
|
Ob es mit jeder Farbtiefe funktioniert kann ich nicht sagen. Würde aber auf ja tippen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.05.2004, 13:10 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Im Grunde dürften die Funktionen nur die inverse version der D3DCOLOR_XRGB,... makros sein also müssten sie recht schnell sein. windows.h muss includiert werden. |
Passt das auch, wenn ich mit DX7 bzw. DirectDraw arbeite?
Code: | #define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) ((BYTE)((rgb) >> 16)) |
So habe ich es ja bisher gemacht. Bloß wird hier ja nur 32 Bit-Farbtiefe berücksichtigt
In JLI1 steht auf Seite 302 ff. der ganze Code zum berechnen. Da steht auch die Fallunterscheidung mit 16 Bit.
Bloß steht da wie man sieht leider nur die Version RGB->COLORREF! _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 17.05.2004, 13:37 Titel: |
|
|
Also nochmal, du willst einen 32Bit Farbwert in 16 Bit umwandeln, ja? Soweit ist das richtig?
Wenn ja, dann muss du wissen, ob es sich um 565 oder 555 handelt und dann:
Wenn 555 und COLORREF enthält einen 32 Bit Farbwert:
Code: |
float fRot = static_cast<float>((nCOLORREF >> 16) & 0xFF);
float fGruen = static_cast<float>((nCOLORREF >> 8) & 0xFF);
float fBlau = static_cast<float>(nCOLORREF & 0xFF);
int nRot = static_cast<int>(fRot / 255.0f * 32.0f);
int nGruen = static_cast<int>(fGruen / 255.0f * 32.0f); // hier bei 565 fGruen / 255.0f * 64.0f
int nBlau = static_cast<int>(fBlau / 255.0f * 32.0f);
// und jetzt wieder shiften:
unsigned short color = nRot << 10 + nGruen << 5 + nBlau; // bzw. nRot << 11 + nGruen << 6 + nBlau
|
Ich habe das einfach mal so hingeschrieben, es enthält bestimmt ein paar Fehler, ich hoffe aber, die Idee wird klar.
C. |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.05.2004, 13:50 Titel: |
|
|
Christian Rousselle hat Folgendes geschrieben: | Also nochmal, du willst einen 32Bit Farbwert in 16 Bit umwandeln, ja? Soweit ist das richtig? |
Ich glaube schon. Ich will einfach den COLORREF bei 16 Bit ausrechnen. Das kommt wohl aufs gleiche heraus.
Aber wie kriege ich jetzt heraus, ob es 555 oder 565 ist? Im Buch steht ja nur, wie man die shiftvariablen herausfinden kann. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 17.05.2004, 14:04 Titel: |
|
|
[quote="The Lord of Programming"] Christian Rousselle hat Folgendes geschrieben: |
Aber wie kriege ich jetzt heraus, ob es 555 oder 565 ist?
|
Es was? Wenn du ein Surface meinst, dann mit GetSurfaceDesc(). GetCaps() könnte auch helfen.
Christian |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.05.2004, 14:10 Titel: |
|
|
Ist das nicht von irgendeiner Einstellung abhängig?
Dann sollten doch alle Surfaces auf einem PC im gleichen Modus sein.
Aber ich probiers mal mit der Surfacebeschreibung. Wo genau in SurfaceDesc ist denn das gespeichert? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
|