RGB wert in einen Integer umwandeln?
-
Hai @ alle, wie kriege ich einen RGB wert in einen Integer umgewandelt, sprich das ich aus den einzelnen Informationen Rot,Gruen, Blau und Alpha einen Integer mache.
z.B:: R=255, G=0, B=0 das ergiebt ja die farbe rot. Alpha ist dann noch 255 also ganz sichtbar.
Wie mache ich jetzt daraus einen INteger wert?????
-
8Bit 8Bit 8Bit 8Bit XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX R G B A
Wenn du RGBA verwendest und Alpha 8 Bit hat.
-
für eine "normale" darstellung, mit rot, bit 1-8 grün, bit 9-16 blau, bit 17-24 alpha, bit 25-32 void CColor::GetColor(unsigned long *Color) { (*Color)=(unsigned long)Red+((unsigned long)Green<<8)+((unsigned long)Blue<<16)+((unsigned long)Alpha<<24); } und für eine directx darstellung, mit rot, bit 17-24 grün, bit 9-16 blau, bit 1-8 alpha, bit 25-32 void CColor::GetColorBGRA(unsigned long *Color) { (*Color)=(unsigned long)Blue+((unsigned long)Green<<8)+((unsigned long)Red<<16)+((unsigned long)Alpha<<24); } Red, Green, Blue und Alpha sind jeweils vom typ "unsigned char" (8bit vorzeichenlos)
hoffentlich kannst du c++
[ Dieser Beitrag wurde am 10.07.2003 um 10:31 Uhr von KXII editiert. ]
-
unsigned char ?
-
Original erstellt von xyz44:
Wie mache ich jetzt daraus einen INteger wert?????Das kommt auf das Farbformat an. Grundsätlich musst du dazu schiften und odern, nur bei Paletten ist's anders.
-
naja, das problem ist das der Befehl einen RGB vaklue in dieser form haben möchte
an integer in form 0x00RRGGBB
-
So vielleicht?
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) #define GetRValue(rgb) ((BYTE)(rgb)) #define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8)) #define GetBValue(rgb) ((BYTE)((rgb)>>16))
ist aus irgendeinem Header vom VC++
-
Moment, solch einen Integer bekommst du so in etwa (wenn ich jetzt keinen Denkfehler drin habe):
inline unsigned int Rgb2Int(unsigned char r, unsigned char g, unsigned char b) { return unsigned short(r) >> 8 | g | unsigned short(b) << 8; }
[ Dieser Beitrag wurde am 10.07.2003 um 18:44 Uhr von MaSTaH editiert. ]
-
na dann nimm die zweite variante. das ist genau das was du brauchst.
void CColor::GetColorBGRA(unsigned long *Color) { (*Color)=(unsigned long)Blue+((unsigned long)Green<<8)+((unsigned long)Red<<16)+((unsigned long)Alpha<<24); }
-
Benutzt keine Makros!
-
Keine Makros??? Warum, sollte doch genauso wie inline wirken oder?
-
SaM schrieb:
Keine Makros??? Warum, sollte doch genauso wie inline wirken oder?
ist das schon in der C++-FAQ? hier ein Link: http://www.gotw.ca/gotw/032.htm
-
Hi,
BRG in int? warum nicht so?
typedef unsigned char BYTE; typedef struct tag_Color { union { int icPart; // "Paket" mit Farbkode BYTE clrPart[4]; // clrPart[0] ist Rot, // clrPart[1] ist Grün, // clrPart[2] ist Blau, // clrPart[3] ist Alpha } color;
und nun hast du deine RGB Werte in einem int
MFG
Kai