amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > RGB to 24bit [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

16.03.2010, 18:16 Uhr

AGSzabo
Posts: 1663
Nutzer
hi,

lang ist her, jetzt programmiere ich wieder. ich möchte drei 32bit werte, welche die farben r, g und b sind, in einen 24bit wert der ordnung %rrggbb umrechnen. wenn ich NICHT runde, kommt es zu verlusten, wenn ich runde, kommt es zu überläufen oder so. ich habe schon einen check eingebaut ob der r, g oder b wert = $ffffffff ist und dann wird nicht gerundet, aber das reicht nicht. was kann man da machen?

forumgrüsse,
ags

code:
WG_RGBto24	; input		d1 = RED	$00000000 bis $ffffffff
		; 		d2 = GREEN	$00000000 bis $ffffffff
		; 		d3 = BLUE	$00000000 bis $ffffffff
		; output: d0 = $rrggbb

		pushm	d4-d6
		moveq	#0,d4
		move.l	d1,d0
		move.l	#$01010101,d1
		moveq	#-1,d6

		move.l	d1,d5			; runden initialisieren:
		lsr.l	#1,d5			; divisor / 2

		cmp.l	d6,d0
		beq.b	.div_r
		add.l	d5,d0			; dividend = dividend + (divisor / 2)

.div_r		bsr	_divu32			; d0.l = d0.l / d1-l
		move.b	d0,d4
		lsl.l	#8,d4

		move.l	d2,d0
		cmp.l	d6,d0
		beq.b	.div_g
		add.l	d5,d0
.div_g		bsr	_divu32
		move.b	d0,d4
		lsl.l	#8,d4

		move.l	d3,d0
		cmp.l	d6,d0
		beq.b	.div_b
		add.l	d5,d0
.div_b		bsr	_divu32
		move.b	d0,d4
		move.l	d4,d0
		popm	d4-d6
		rts


--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

16.03.2010, 19:02 Uhr

geit
Posts: 332
[Ex-Mitglied]

Hmm, reichte es nicht einfach aus nur die oberen 8 Bits der Komponenten zu nehmen?

Nix mit umrechnen oder wandeln.

Geit

[ - Antworten - Zitieren - Direktlink - ]

16.03.2010, 19:10 Uhr

AGSzabo
Posts: 1663
Nutzer
@geit:

kann sein, oder? das ist vieleicht eine gute idee! kann das jemand bestätigen?

danke,
ags
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

16.03.2010, 19:12 Uhr

Holger
Posts: 8116
Nutzer
@AGSzabo:
Könntest Du den gewünschten Algorithmus in einer anderen Sprache als Assembler, meinetwegen informellem Deutsch, formulieren?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

16.03.2010, 19:34 Uhr

AGSzabo
Posts: 1663
Nutzer
danke holger, danke geit, das problem hat sich gelöst indem ich geits rat befolgt habe:

code:
RGB_to_24	moveq	#24,d0

		lsr.l	d0,d1
		lsr.l	d0,d2
		lsr.l	d0,d3

		moveq	#0,d0

		move.b	d1,d0
		lsl.l	#8,d0
		move.b	d2,d0
		lsl.l	#8,d0
		move.b	d3,d0

		rts

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 16.03.2010 um 19:34 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

16.03.2010, 19:35 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von geit:
Hmm, reichte es nicht einfach aus nur die oberen 8 Bits der Komponenten zu nehmen?

So wird es meist gemacht, 100% korrekt ist aber es nicht.

Der Grund dafür liegt darin, dass nicht 0x100000000 und 0x100 dem maximalen Weiß entsprechen, sondern 0xffffffff und 0xff. Anders gesagt, nur die oberen 8 Bit des 32 Bit Wertes zu verwenden, hieße, einen Faktor von 0x01000000 zu verwenden, während der Faktor eigentlich 0xffffffff/0xff = 0x01010101 ist.

Um mal einen Beispielwert zu nennen, bei dem ein Unterschied entsteht:
0xe0000000/0xffffffff entspricht 87,5%
0xe0/0xff entspricht 87,8%, 0xdf/0xff entspricht 87,45%.

Hier liegt also der Wert, der durch Verwenden der oberen 8Bit entsteht, weiter vom gewünschten Wert weg als ein anderer 8Bit Wert. 0xe0000000/0x01010101 liefert dagegen den präziseren Wert 0xdf.

Allerdings sind die meisten 32Bit-Farbwerte in der Praxis durch einen Prozess entstanden, der mindestens genauso ungenau ist wie die vereinfachte Konvertierung.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > RGB to 24bit [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.