Problem bei Bitschiebereien

28/10/2008 - 12:50 von Curtis Newton | Report spam
Hallo,

ich weiß nicht, ob mein Problem auf der C-Seite oder auf der Linux-Seite
liegt, aber irgendwo muss man ja anfangen.

Ich will den Linux-Framebuffer programmieren. Dieser hat 16bpp. Um jetzt
einen Grauwert darzustellen, benutze ich folgenden Code:

unsigned char vr,vg,vb; // rot, gruen, blau
vr=vg=vb=grauwert;

vr>>3; vr=vr&31; // schiebe mal und maskiere
vg>>2; vg=vg&63; // fuer grund 6bit, fuer den Rest 5
vb>>3; vb=vb&31;

// fuege die Farbwerte zusammen
unsigned short int t = vr<<11 | vg << 5 | vb;
*((unsigned short int*)(fbp + location)) = t;

fbp ist dabei der Pointer auf den Framebuffer. Obiger Code funktioniert,
wenn ich weiß (Grauwert 255) oder schwarz (Grauwert 0) darstellen will
(auch wenn ich manuell t auf 0xFFFF setze, wirds weiß, bei 0 schwarz).

Leider funktioniert der Code nicht bei Werte >0 und <255. Bei dunklen
Werten wird zuviel grün, bei hellen zuwenig dargestellt und es kommt
somit zu Farbverfàlschungen.

Ich weiß jetzt nicht so richtig, wieso nicht. Vielleicht siehts ja hier
einer und kann mir den entscheidenden Hinweis geben? Danke.

Bye
 

Lesen sie die antworten

#1 Rainer Weikusat
28/10/2008 - 12:54 | Warnen spam
Curtis Newton writes:
ich weiß nicht, ob mein Problem auf der C-Seite oder auf der Linux-Seite
liegt, aber irgendwo muss man ja anfangen.

Ich will den Linux-Framebuffer programmieren. Dieser hat 16bpp. Um jetzt
einen Grauwert darzustellen, benutze ich folgenden Code:

unsigned char vr,vg,vb; // rot, gruen, blau
vr=vg=vb=grauwert;

vr>>3; vr=vr&31; // schiebe mal und maskiere
vg>>2; vg=vg&63; // fuer grund 6bit, fuer den Rest 5
vb>>3; vb=vb&31;



Die shifts bewirken so gar nichts (vr >>= 3? vr = (vr >> 3) & 31?).


// fuege die Farbwerte zusammen
unsigned short int t = vr<<11 | vg << 5 | vb;



Und sollte obiges vielleicht eine solchermassen zusammengesetzten Wert
zerlegen? Dann muesste es

vr = grau >> 11;
vg = (grau >> 5) & 63;
vb = grau & 31;

sein (ohne Gewaehr).

Ähnliche fragen