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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

11.09.2007, 21:52

überlegs dir mal so (dezimal):

du hast den zahlenbereich von 0..1000. den willst du jetzt in den bereich von 0..10 mappen (eben so, dass das verhältnis gleichbleibt).

sagen wir, wir hätten die zahl 234:

234 / 1000 = 0,234 -> 23,4% von 1000
0,234 * 10 = 2,34

234 umgemappt ist also 2.
2 ist genau der wert der beiden höchstwertigen stellen von 0234. wir nehmen also einfach immer die höchstwertigen stellen und vergessen den rest.

hätten wir also jetzt z.b. den farbwert 10011010b (154) im intervall 0..255. dann rechnen wir ihn um auf 0..16:

154 / 255 = 0.6039...
0.6039 * 16 = 9,66...

die höchstwertigen 4 bits:
1001b = 9 dezimal

wenn du jetzt runden wolltest, müsstest du einfach noch ein bit mehr anschauen und, je nachdem ob dieses 0 oder 1 ist, 1 addieren oder nicht (also einfach das fünfthöchstwertige bit addieren)

eine andere überlegung wäre z.b. noch, dass ja die höchstwertigen bits die sind, die sich am langsamsten ändern. die grundinformation steckt also in den höchstwertigen bits und es wird genauer je mehr niederwertige du dazunimmst.

das is jetzt alles ziemlich unwissenschaftlich ausgedrückt. ich hoffe mal es is nicht zu verwirrt und du weist was ich meine ^^

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

11.09.2007, 23:05

Zitat von »"dot"«

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);
}


Genau so hab ich das gemeint! :)
@D13_Dreinig

13

11.09.2007, 23:54

okay ich glaub ich habs jetzt verstanden, danke allen :>

Ich würde euch ja jetzt gerne meinen image-compress0r zur verfügung stellen, aber leider packt der so übel, dass an der Stelle, wo euer Rechner war ein schwarzes Loch entsteht und das All wegsaugt!

Oder so ähnlich jedenfalls :D

Werbeanzeige