Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.09.2007, 16:11

Farben anpassen

hallöchen,

ich hänge jetzt seit mehreren Stunden an diesem dämlichen Problem und sehe den Wald vor lauter Bäumen nicht mehr. Ich hab Farben in einem int gespeichert (ARGB) und will das ganze in das Format RGB mit jeweils 4 Bit pro Farbe bringen.

Ich krieg das aber einfach nicht sinnvoll konvertiert. Wenn ich für rot zb. 1111 1111 hab müsste das ja in 4 Bit gequetscht 1111 ergeben. Meine erste Methode war einfach zum 8 Bit-Wert die Zahl 1 dazuzuaddieren, dann durch 16 zu teilen und die 1 wieder abzuziehen. Probleme gibts dann allerdings bei Zahlen <15, weil das Ergebnis negativ wird.
Die andere Methode war einfach durch 15 zu teilen und dann zu runden, aber besonders schön ist das auch nicht, mal abgesehen von den Rundungsfehlern.

Stehe ich jetzt so dermaßen auf dem Schlauch, dass neben mir gleich die fette Wasserblase platzt oder wie macht man das am geschicktesten?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

11.09.2007, 16:16

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned int r2,g2,b2;
r2 = (unsigned short)((PointColor & 0x00FF0000) >> 16);
g2 = (unsigned short)((PointColor & 0x0000FF00) >> 8);
b2 = (unsigned short)(PointColor & 0x000000FF);
                        
r2 += r1;
g2 += g1;
b2 += b2;

if(r2 > 0xFF) r2 = 0xFF;
if(g2 > 0xFF) g2 = 0xFF;
if(b2 > 0xFF) b2 = 0xFF;

PointColor = 0xFF000000 | r2 * 0x0001FFFF | g2 * 0x000001FF | b2;

Beispiel für zerlegen und wieder zusammensetzen von Farben. Falls es Fragen gibt einfach melden :)

P.S: sehe gerade, dass da einige Castfehler drinne sind, funktioniert aber trotzdem ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

11.09.2007, 16:31

Was ist denn r1 ung g1? :) Egtl sollte man die überflüssigen 4 Bit einfach abschneiden können, die Werte überlaufen halt die möglichen Farbwerte?!
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

11.09.2007, 16:43

r1 g1 b1 sind Farbwerte, die hinzugefügt werden und die if-Bedingungen verhindern, dass die Teilfarben über 255 gehen ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

11.09.2007, 18:24

Ich weiß was die If-Anweisung macht aber:

C-/C++-Quelltext

1
b2 += b2;


Müsste dann doch eher b2 += b2 heißen. Und deine Lösung entspricht nicht zu 100% der Fragestellung, wenn ich das nicht falsch sehe?!
@D13_Dreinig

6

11.09.2007, 19:16

Zitat von »"David_pb"«

Was ist denn r1 ung g1? :) Egtl sollte man die überflüssigen 4 Bit einfach abschneiden können, die Werte überlaufen halt die möglichen Farbwerte?!


meinst du damit die 4 oberen oder unteren bits? :>

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

11.09.2007, 19:21

Ahh richtig muss b2 += b1 heißen^^. Danke für den Hinweis.
Wegen der Fragestellung: Ich bin von ausgegangen, dass er einen IntFarbwert in die Farbkomponeten zerlegen will.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

11.09.2007, 19:29

Zitat von »"Sk!p"«

Zitat von »"David_pb"«

Was ist denn r1 ung g1? :) Egtl sollte man die überflüssigen 4 Bit einfach abschneiden können, die Werte überlaufen halt die möglichen Farbwerte?!


meinst du damit die 4 oberen oder unteren bits? :>


Die 4 unteren Bits meine ich damit. Die kannst du ja übernehmen und zusammenschieben.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

11.09.2007, 20:07

ich glaub ich weis was du willst. imo nimmst du einfach die obersten 4 bit pro kanal und fertig ;)

C-/C++-Quelltext

1
2
3
4
5
6
WORD blub(DWORD color)
{
    return  ((color & 0xF0) >> 4) |
              ((color & 0xF000) >> 8) |
              ((color & 0xF00000) >> 12);
}

10

11.09.2007, 21:23

Das hat einer meiner Tutoren auch gesagt...

Ich glaub ich mach mir erstmal klar, wieso das so funktioniert. Ich hab immer so die Angewohnheit einfach drauf los zu coden (bzw. dann wohl eher koten)

Werbeanzeige