24-Bit zu 16-Farben-Raster

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: 24-Bit zu 16-Farben-Raster

Beitrag von es_91 »

Hey, alter Mann, Du bist meine Rettung!

Absolut Spitze!!! Genau so wird's gemacht. Schön, dass Du Dir die Mühe gemacht hast.

Würde Dir gern meinen vollsten Dank ausdrücken!! :D

/e: Mann, Dein Programmtext ist wirklich brauchbar! Hast Du Dir das selbst ausgedacht? :allright:
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: 24-Bit zu 16-Farben-Raster

Beitrag von alter Mann »

ja hab ich, allerdings für einen anderen Zweck, als Anpassung an die vordefinierten AUTOCAD-Farben :D
Win11 64Bit / PB 6.0
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: 24-Bit zu 16-Farben-Raster

Beitrag von NicTheQuick »

Ich hätte das ganze wahrscheinlich mit dem HSV-Farbraum versucht, aber das wäre wahrscheinlich wieder Overkill. Ich denke auch, dass Suche-Minimum-Routine von alter Mann, vollkommen reicht.
Bild
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: 24-Bit zu 16-Farben-Raster

Beitrag von Rings »

So ganz vestehe ich den Code nicht, da er nicht direkt ausführbar ist.
Hat jemand ein snippet der funktioniert ?
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: 24-Bit zu 16-Farben-Raster

Beitrag von NicTheQuick »

Der Code berechnet im Grunde einfach den euklidischen Abstand zwischen allen 16 DOS-Farben und der gesuchten Farbe, die man als 24-Bit-Code angegeben hat. Und dann kriegt man als Ergebnis die Nummer der Farbe, die am nächsten an der gesuchten Farbe dran liegt.

Edit:
Hier noch eine abgeänderte Version, die auch direkt lauffähig ist:

Code: Alles auswählen

Structure Color24
	r.a
	g.a
	b.a
EndStructure
Structure Color24Array
	count.i
	c.Color24[0]
EndStructure

Global *colorPalette16.Color24Array = ?ColorPalette16

Procedure getNearestPaletteColor(color.l, *palette.Color24Array)
	Protected i.i, min.i = 255 * 255 * 3, diff.i, rDiff.i, gDiff.i, bDiff.i
	Protected minColor.i = -1
	
	For i = 0 To *palette\count - 1
		rDiff = Red(color) - *palette\c[i]\r
		gDiff = Green(color) - *palette\c[i]\g
		bDiff = Blue(color) - *palette\c[i]\b
		diff = rDiff * rDiff + gDiff * gDiff + bDiff * bDiff
		If (diff < min)
			minColor = i
			min = diff
		EndIf
	Next
	
	ProcedureReturn minColor
EndProcedure

Debug getNearestPaletteColor(RGB(12, 34, 56), *colorPalette16)
Debug getNearestPaletteColor(RGB(127, 0, 200), *colorPalette16)

DataSection
	ColorPalette16:
		Data.i 16
		Data.a	0, 0, 0,
				0, 0, 127,
				0, 127, 0,
				0, 127, 127,
				127, 0, 0,
				127, 0, 127,
				127, 127, 0,
				191, 191, 191,
				127, 127, 127,
				0, 0, 255,
				0, 255, 0,
				0, 255, 255,
				255, 0, 0,
				255, 0, 255,
				255, 255, 0,
				255, 255, 255
EndDataSection
Bild
Antworten