Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » bitweises Verschieben...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.12.2003, 16:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Scheinbar bin ich echt zu blöd:

Habe folgende Bits:


Code:
F E D C B A 9 8 7 6 5 4 3 2 1 0
X R R R R R G G G G G B B B B B



(also 0-4 B, 5-9 G, A-F R)

ich möchte nun die jeweiligen RRRRR's, GGGGG's und BBBBB's in Bytes umwandeln, also aus einem 555-Bitmap ein RGB-raw-Image machen.

wie komm ich nun an die Werte ran? ich stell mich heut echt zu blöd?!?!
--
class God : public ChuckNorris { };

Dieser Post wurde am 29.12.2003 um 16:01 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.12.2003, 16:13 Uhr
0xdeadbeef
Gott
(Operator)


Mit anderen Worten, du willst einen u16 auseinandernehmen. Naja, die einfachste Möglichkeit wäre:

C++:
u16 x = 21552; /* nur so zum Beispiel... */
char blue, green, red;

blue = x & 31; /* 31 == 11111 binär */
green = (x >> 5) & 31;
red = (x >> 10) & 31;


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.12.2003, 16:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


soweit so gut, endlich hab ich das mal gecheckt (hoff ich zumindest)!
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.12.2003, 09:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Scheinbar tut irgendwas noch nicht so ganz funktionieren:

Bild entfernt

Die Routine war folgende:


C++:
struct RGBA {
  BYTE r, g, b, a;
};

RGBA BMP2RGBA(USHORT bmp)
{
  int add = 128; // <- musste ich hinzufügen sonst wars einfach schwarz
  RGBA rgba;
  rgba.b = add + (bmp & 31); /* 31 == 11111 binär */
  rgba.g = add + ((bmp >> 5) & 31);
  rgba.r = add + ((bmp >> 10) & 31);
  rgba.a = 255;
  return rgba;
}



Warum ist das so farbschwach???
--
class God : public ChuckNorris { };

Dieser Post wurde am 30.12.2003 um 13:26 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.12.2003, 11:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hab es nun, dank chinesischen Quellcodes (den ich geschafft habe zu entziffern ), korrigieren können:


C++:
RGBA BMP2RGBA(USHORT bmp)
{
  RGBA rgba;
  rgba.r = ((bmp >> 10) & 0x1F)* 0xFF / 0x1F;
  rgba.g = ((bmp >> 5) & 0x1F)* 0xFF / 0x1F;
  rgba.b = (bmp & 0x1F)* 0xFF / 0x1F;
  rgba.a = 255;
  return rgba;
}



So funktionierts !
--
class God : public ChuckNorris { };

Dieser Post wurde am 30.12.2003 um 13:26 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.12.2003, 19:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm nun hab ich noch ein Problem, wie mach ich das ganze umgekehrt?

also ich hab die RGB-Werte als bytes (0-255) und möchte nun wieder einen u16 haben?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.12.2003, 19:10 Uhr
0xdeadbeef
Gott
(Operator)



C++:
rgb = (((u16) red) << 10) | (((u16) green) << 5) | blue


Oder besser gleich in einer Funktion (spart die casts):

C++:
u16 rgb(u16 red, u16 green, u16 blue) {
  return (red << 10) | (green << 5) | blue;
}


Ich gehe dabei davon aus, dass die Werte von red, green und blue auch in 5 bit passen würden. Wenn du dich gegen bogus-input absichern willst, machs so:

C++:
u16 rgb_safe(u16 red, u16 green, u16 blue) {
  return ((red & 31) << 10) | ((green & 31) << 5) | (blue & 31);
}


Das frißt dann allerdings auch mehr Rechenzeit.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 30.12.2003 um 19:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.12.2003, 07:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ok danke, funktioniert...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: