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. ]



  • @xyz44

    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


Anmelden zum Antworten