Gå til innhold

Problemer med konverteringskode - HSL -> RGB


Anbefalte innlegg

Jeg har prøvd å lage en kode for å konvertere HSL verdier til RGB verdier. Men det ser ikke ut til å virke.. Hva gjør jeg feil? Algoritmen har jeg hentet fra Wikipedia

(Og ja, det er en funksjon for å hente det i java.awt.Color, men poenget her er at jeg skal lage en konverterer og ikke bruke noen "snarvei"....)

 

public class ColorConverter {

public double H = 50;
double S = .5;
double L = .4;
double R;
double G;
double B;
double p, q;
double hk;
double tr, tg, tb;

void toRGB() {
	if (S == 0.0){
		R = L * 255;
		G = L * 255;
		B = L * 255;
	} else {
		if (L <= 0.5) {
			q = L * (1 + S);
		} else {
			q = (L + S) - (S * L);
		}
		p = 2 * L - q;

		hk = H / 360;

		tr = hk + 1/3;
		tg = hk;
		tb = hk - 1/3;

		//RED
		if (tr<0) tr += 1;
		if (tr>1) tr -= 1;
		//GREEN
		if (tg<0) tr += 1;
		if (tg>1) tr -= 1;
		//BLUE
		if (tb<0) tr += 1;
		if (tb>1) tr -= 1;

		R = colorCalc(tr) * 225;
		G = colorCalc(tg) * 255;
		B = colorCalc(tb) * 255;

	}
	System.out.println("R: " + R + ", G: " + G + ", B: " + B);
}

double colorCalc(double tc){
	if (tc < 1/6){
		return p + ((q-p) * 6 * tc);
	}
	if (tc < 1/2){
		return q;
	}
	if (1/2 <= tc && tc < 2/3){
		return p + ((q-p) * 6 * (2/3 - tc));
	}
	return p;
}

static public void main(String args[]) {
	new ColorConverter().toRGB();
}
}

Lenke til kommentar
Videoannonse
Annonse

Hva vil du vite? Vil du ha en løsning, eller bare finne ut hvor i algoritmen din det er noe gale?

 

Hva er feil? Får du kun ut [0,0,0] for HSL?

 

I tillegg er koden din litt på kanten hårete. Ta utgangspunkt i denne istedenfor:

import java.awt.Color;

public class ColorConverter {

public static int[] toRGB(Color color) {
	int r = color.getRed();
	int g = color.getGreen();
	int b = color.getBlue();
	int[] hsl = new int[3];

	hsl[0] = calculateHue(r, g, b);
	hsl[1] = calculateSaturation(r, g, b);
	hsl[2] = calculateLightness(r, g, b);
	return hsl;
}

private static int calculateHue(int r, int g, int b) {
	// TODO returner riktig verdi
	return 1;
}

private static int calculateSaturation(int r, int g, int b) {
	// TODO returner riktig verdi
	return 2;
}

private static int calculateLightness(int r, int g, int b) {
	// TODO returner riktig verdi
	return 3;
}

static public void main(String args[]) {
	for (int r = 0; r < 255; r++) {
		for (int g = 0; g < 255; g++) {
			for (int b = 0; b < 255; b++) {
				int[] hsl = ColorConverter.toRGB(new Color(r, g, b));
				System.out.println(r + ", " + g + ", " + b + ":\t" + hsl[0]
						+ ", " + hsl[1] + ", " + hsl[2]);
			}
		}
	}
}
}

 

Men merk at test-casen kjører 16 millioner farger gjennom testingen og oppretter en del unødvendige objekter.

 

Men det er uansett bedre å bruke koden når den en gang blir ferdig!

Lenke til kommentar

Det er et par problemer med din kode; blant annet at den bare skriver ut verdien slik, og ikke returnerer noe som helst. Hvis metoden bare skal ta inn RGB-verdiene, endrer du metoden slik:

public class ColorConverter {

public static int[] toRGB(int r, int g, int b) {
	double[] hsl = new double[3];

	hsl[0] = calculateHue(r, g, b);
	hsl[1] = calculateSaturation(r, g, b);
	hsl[2] = calculateLightness(r, g, b);
	return hsl;
}

private static double calculateHue(int r, int g, int b) {
	// TODO returner riktig verdi
	return 1;
}

private static double calculateSaturation(int r, int g, int b) {
	// TODO returner riktig verdi
	return 2;
}

private static double calculateLightness(int r, int g, int b) {
	// TODO returner riktig verdi
	return 3;
}

static public void main(String args[]) {
	for (int r = 0; r < 255; r++) {
		for (int g = 0; g < 255; g++) {
			for (int b = 0; b < 255; b++) {
				int[] hsl = ColorConverter.toRGB(r, g, b);
				System.out.println(r + ", " + g + ", " + b + ":\t" + hsl[0]
						+ ", " + hsl[1] + ", " + hsl[2]);
			}
		}
	}
}
}

Den måten er ihvertfall mer objektorientert, og mye mer hva du ville ha brukt hvis du skulle bruke koden til noe praktisk. Men, selvsagt, hvis det ikke er av interesse, og det kun er algoritmen for algoritmens skyld du gjør dette; føl deg fri til å gjøre det på hvilken som helst måte som passer deg best.

 

Men når du sier feil returverdier; har du en anelse om hvorfor de er feil? Er noen av verdiene rett? H, S eller L?

Lenke til kommentar

Den returnerer ikke enda, fordi jeg bare prøver meg på konseptet. Jeg har ikke peiling på hvordan man konverterer farger, så ett sted må jeg jo begynne. Så jeg vil jo bytte ut den println linjen med en retur linje, eller i det hele tatt skrive om koden.

 

Men jeg ser nå at jeg har sett meg blind på hsl og hsb.. To forskjellige måter å regne ut.. Skal se om det hjelper.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...