Bitmasken

tr0nix

tr0nix

der-mit-dem-tux-tanzt
Hallo zusammen

Ich will fuer ein kleines SDL-Projekt transparenz und Alpha benutzen. Dabei muss ich ein 4-Byte-Integer haben (Uint32 gibt es von SDL gestellt).

Jetzt habe ich ein kleines Problem. Und zwar sind in dem Uint32 die ersten 3 bytes fuer die Farben (RGB) und der letzte Value fuer den Alpha-Wert.

Wie kann ich jetzt aus dem 4-Byte-Integer die Werte der einzelnen Farben und des Alpha-Wertes rauskriegen (bitshifting? bitmask?)? Die Funktion welche SDL benutzt um dies auf ein Surface abzubilden will die Farben naemlich einzeln zugeteilt haben.
Ist eigentlich etwas simples, aber ich bin mit den Bitmasks und so noch nicht sehr fest.
 
A

Anzeige

Hallo tr0nix,

schau mal hier: Bitmasken. Dort wird jeder fündig!
thorus

thorus

GNU-Freiheitskämpfer
Ok, wenn ich mich recht erinnere geht das so:

Beispiel eines 4Byte ints...
10101010 11111111 00000000 0101010101

Nun wollen wir den ersten Wert gerne haben, also shiften wir das ganze um 3 bytes = 24 bits nach rechts.
Also:
Code:
var >= 24;

Soweit so einfach... wenn wir jetzt einen in der Mitte bzw. Hinten haben wollen schieben wir einfach den Rest beiseite.
Beispiel: 3. Byte
Code:
var <= 16;
var >= 24;

Keine Garantie, dass das stimmt, einfach nur mal so hingeschrieben ;)
 
tr0nix

tr0nix

der-mit-dem-tux-tanzt
Ja diese Idee hatte ich auch schon, fand sie aber etwas sehr umstaendlich!
Eigentlich koennte man das ganze ja mit XOR verknuepfen:
0xABCDABCD ^ 0xFF00FFFF = 0x00CD0000

Jetzt muesste man das ganze nur noch nach rechts shiften:
0x00CD0000 >> 16 = 0x000000CD

Also zaehlen wir 1&1 zusammen:
(0xABCDABCD ^ 0xFF00FFFF) >> 16 = 0x000000CD

Ich kann meine "Theorie" leider gerade nicht testen (Freundin hier, boese Augen beobachten mich beim schreiben ;)) aber so sollte es doch gehen?
 
M

Malshun

Jungspund
> man SDL_GetRGBA
-----
void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a);
-----

mfg,
malshun
 
H

hoza

Jungspund
tr0nix schrieb:
Ja diese Idee hatte ich auch schon, fand sie aber etwas sehr umstaendlich!
Eigentlich koennte man das ganze ja mit XOR verknuepfen:
0xABCDABCD ^ 0xFF00FFFF = 0x00CD0000

Jetzt muesste man das ganze nur noch nach rechts shiften:
0x00CD0000 >> 16 = 0x000000CD

Also zaehlen wir 1&1 zusammen:
(0xABCDABCD ^ 0xFF00FFFF) >> 16 = 0x000000CD

Ich kann meine "Theorie" leider gerade nicht testen (Freundin hier, boese Augen beobachten mich beim schreiben ;)) aber so sollte es doch gehen?

Mit xor wirds nicht klappen aber versuch doch mal den & (bitweises und) operator:
0x ab cd ef 12 &
0x 00 FF 00 00 =
0x 00 cd 00 00

Und das dann mit >> verschieben.
 
tr0nix

tr0nix

der-mit-dem-tux-tanzt
Malshun schrieb:
> man SDL_GetRGBA
-----
void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a);
-----

mfg,
malshun
Ich brauche den Wert in Uint32 weil ich es so im Struct abspeichern will. Ausserdem was nuetzt mir diese Funktion wenn vom User (bzw. schlussendlich Configdatei) die Farbe fuer die Transparenz bestimmt werden soll? Mit GetRGBA krieg ich nur die Farbe eines Pixels, aber das bringt mir nichts.


hoza:
Stimmt danke! Ich verwechsle dieses Zeugs immer ;)

Hier zum nachvollziehen fuer Interessierte:
Code:
#include <stdio.h>

int main(void)
{
        int wert = 0x10BB,
            bitmaske = 0xFF00,
            resultat = 0;

        resultat = (bitmaske & wert) >> 8;

        printf("%i ist das Resultat\n", resultat);
}
 

Ähnliche Themen

Probs mit Perl script

Problem mit Apache2 + MySQL Server

Ausgabe in *.txt Datei & Struct

einige Probleme...

Compileroptionen

Oben