einen color-chooser bauen, ähnliche Farben vermeiden

Bug Fisher

Bekanntes Mitglied
Hallo,

ich habe mir einen color-chooser (gui) gebaut, was sich für mich als schwieriger herausgestellt hat, als ich dachte.
Signatur (die Klasse beerbt JComponent):

Java:
public SmallColorChooser(final int nx, final int ny, final int fieldSize)

Dies erzeugt erzeugt nx * ny gefärbte Quadrate die zur Auswahl zur Verfügung stehen.

Jetzt stand ich vor dem Problem, alle Permutationen der Farben von (0,0,0) bis (255,255,255) gleichmäßig auf nx*ny aufzuteilen. Ich glaube man nennt das Interpolation.

Schlussendlich kam ich auf die Idee, den gesamten Farbraum durch die Anzahl der Felder zu teilen, um in diesem Abstand darüber zu iterieren. Dann fasse ich den Anteil jeder Iteration als eine Zahl zur Basis 256 auf und extrahiere damit also die einzelnen der drei Komponenten:
(Das wäre sicher mit bitshift eleganter gewesen, habe ich mittlerweile gelernt)

Java:
final int base = 256;
final int step = (base*base*base-1)/(n-1);
int[] rgb = new int[3];
int v;
		
for(int i = 0; i < n; ++i) {
       //elided
	v = i*step;
	for(int j = 0; j < rgb.length; ++j) {
		rgb[j] = v%base;
		v /= base;
	}
			
	field[i].setBackground(new Color(rgb[0], rgb[1], rgb[2]));
}

Jetzt hat sich aber herausgestellt, dass es bestimmte Anzahlen von Feldern nx*ny gibt, die sehr ungünstige Interpolationen erzeugen; im schlimmsten Fall nur Grauwerte (das ist aber kein Problem mehr); störend sind sehr ähnlich wirkende Farben mit größerem Abstand zueinander.

Durch Ausprobieren fand ich heraus, dass diese sehr ähnlich wirkenden Farben die gleiche Komponentensumme haben.
Ausprobieren hiess wirklich brut-force - deswegen schreibe ich hier: mir fehlt die nötige Mathematik und das Verständnis, wann es zu solchen Effekten kommt und wann nicht.
Ich meine, ich hätte gerne irgendeine Berechnungsvorschrift, die mir nicht nur sagt, wann gleiche Komponentensummen nicht vorkommen (die gibt es), sondern mir gleich mitliefert, was eine besonders günstige Anzahl wäre.

Kann mir da jemand auf die Sprünge helfen ?
 
Ich kapiere ehrlich gesagt nur Bahnhof.

Du kannst kein dreidimensionales Array (R,G,B) in einem zweidimensionalen Rechteck abbilden. Du wirst immer eine Komponente haben die du über ein zusätzliches Control bestimmen must.

Gruss

Claus
 
Dass die Farben schliesslich in einem Rechteck landen, ist ja nur gui-Kram, eigentlich versuche ich die drei Komponenten in einer einzigen Dimension zu interpolieren - und es geht auch - nur kapiere ich nicht wann es gut geht und wann nicht so günstig.
 
Du Hast N Felder (nx * ny = N) und willst dann 255^3 / N Farben darstellen. Verstehe ich das richtig? Und beim Einteilen in gleiche Abstände kommt dieser Effekt zustande?
 
Mach es doch einfach gleich richtig und mach einen HSB requester mit einem HU farbfeld und einem B slider. Damit kannst du den Farbraum komplett abdecken und der User hat einen requester den er von allen anderen Image-Processing Programmen her kennt.

Gruss

Claus
 
Tobse hat gesagt.:
Du Hast N Felder (nx * ny = N) und willst dann 255^3 / N Farben darstellen. Verstehe
ich das richtig? Und beim Einteilen in gleiche Abstände kommt dieser Effekt zustande?

Ja, genau so ist das 🙁

Hier ein kleiner Ausschnitt meiner Liste der Parameter, die diese Effekte NICHT erzeugen; da kommen also keine mehrfach-gleichen Komponentensummen vor (und es sieht dann auch plausibel aus):

Code:
5x15
5x16
5x17
5x19
6x2
6x3
6x4
6x5
6x8
6x9
6x12
6x16
6x17
6x18
7x4
7x5
7x7
7x10
7x11
7x13
8x2

Thallius hat gesagt.:
Mach es doch einfach gleich richtig und mach einen HSB requester...

Ja, über andere Farbräume habe ich auch schon nachgedacht, aber es soll einfach (wie in zB Paint) für den Benutzer sein. Ausserdem habe ich mich auch an irgendwie an diesem Problem "festinteressiert" 🙂
Ein Würfelnetz hatte ich auch noch als Idee...

Aber ich hätte eben dafür jetzt gerne eine Antwort, wenngleich ich -arbitrary- ganz gute Parameter gewählt habe - es interessiert mich und es könnte vielleicht noch besser (eben am besten) sein 🙂

Das klingt alles so easy dahin geschrieben, aber ich sitze jetzt schon ~25h an meinem SmallColorChooser 🙂
 

Zurück
Oben