Wenn es Ihnen nichts ausmacht, Ganzzahlen mit Byte-Größe für RGBA zu verwenden, können Sie eine Union verwenden. [] edit Dies ist eine häufig verwendete Methode und Sie werden wahrscheinlich keinen Compiler finden, der es nicht unterstützt, aber streng genommen (so wird mir gesagt) ist es ein illegaler Hack. In den meisten Fällen ist der bessere Ansatz eine mathematische oder binäre Konvertierung, aber ich werde diese Hälfte meiner Antwort an Ort und Stelle belassen, weil es dem Leser helfen kann, zu verstehen, was Menschen tun, wenn sie diese Art von Code in der Realität sehen Welt]
union RGBA
{
DWORD dword;
unsigned char RGBA[4];
struct RGBAstruct
{
unsigned char b;
unsigned char g;
unsigned char r;
unsigned char a;
}
};
Dann können Sie die grüne Komponente zugreifen, wie:
RGBA colour;
int green = (int) colour.RGBA[2];
oder
int green = (int) colour.RGBAstruct.g;
und Zugriff auf den DWORD-Wert als
DWORD value = colour.dword;
Wenn Sie die RGBA-Werte als int-Werte benötigen oder einen Konvertierungsansatz verwenden möchten, müssen Sie bitweise Operatoren verwenden.
Sie codieren sie fast korrekt, aber Sie müssen bitweise ODER-Operator verwenden |, nicht logisch ODER || Betreiber:
DWORD value = (iA << 24) | (iR << 16) | (iG << 8) | iB;
in umgekehrter Richtung zu gehen:
int iA = (value >> 24) & 0xff;
int iR = (value >> 16) & 0xff;
int iG = (value >> 8) & 0xff;
int iB = (value) & 0xff;
Wahrscheinlich nur ein Tippfehler, aber Sie müssen '|' Operator in der Verpackungsfunktion verwenden, nicht '||'. – AnT
Warum wird Ihr 'tmp' als 'statisch' deklariert? Wollten Sie einen Zeiger zurückgeben? – AnT
Manchmal habe ich eine Compiler-Warnung erhalten, wenn ich eine in einer Funktion deklarierte Variable zurückgebe. Also habe ich es als statisch erklärt um die Warnung zu verhindern ..? Nein? –