Updated color conversions and tests

This commit is contained in:
BWS Systems
2019-09-26 14:12:41 -05:00
parent 79ce23b80a
commit 768eebfc78
3 changed files with 93 additions and 160 deletions

View File

@@ -939,4 +939,25 @@ public class ColorConverter {
return xyz;
}
public static int[] normalizeRGB(int[] rgb) {
int[] newRGB = new int[3];
newRGB[0] = assureBounds(rgb[0]);
newRGB[1] = assureBounds(rgb[1]);
newRGB[2] = assureBounds(rgb[2]);
return newRGB;
}
private static int assureBounds(int value) {
if (value < 0.0) {
value = 0;
}
if (value > 255.0) {
value = 255;
}
return value;
}
}

View File

@@ -30,162 +30,32 @@ public class ColorDecode {
public static List<Integer> convertHSLtoRGB(HueSatBri hsl) {
List<Integer> rgb;
float decimalBrightness = (float) 0.0;
float var_1 = (float) 0.0;
float var_2 = (float) 0.0;
float h = (float) 0.0;
float h2 = (float) 0.0;
float s = (float) 0.0;
double r = 0.0;
double g = 0.0;
double b = 0.0;
if (hsl.getBri() > 0)
decimalBrightness = (float) (hsl.getBri() / 255.0);
if (hsl.getHue() > 0) {
h = ((float) hsl.getHue() / (float) 65535.0);
h2 = h + (float) 0.5;
if (h2 > 1.0) {
h2 = h2 - (float) 1.0;
}
}
if (hsl.getSat() > 0) {
s = (float) (hsl.getSat() / 254.0);
}
if (s == 0) {
r = decimalBrightness * (float) 255;
g = decimalBrightness * (float) 255;
b = decimalBrightness * (float) 255;
} else {
if (decimalBrightness < 0.5) {
var_2 = decimalBrightness * (1 + s);
} else {
var_2 = (decimalBrightness + s) - (s * decimalBrightness);
}
;
var_1 = 2 * decimalBrightness - var_2;
float onethird = (float) 0.33333;
float h2Plus = (h2 + onethird);
float h2Minus = (h2 - onethird);
log.debug("calculate HSL vars - var1: " + var_1 + ", var_2: " + var_2 + ", h2: " + h2 + ", h2 + 1/3: "
+ h2Plus + ", h2 - 1/3: " + h2Minus);
r = 255 * hue_2_rgb(var_1, var_2, h2Plus);
g = 255 * hue_2_rgb(var_1, var_2, h2);
b = 255 * hue_2_rgb(var_1, var_2, h2Minus);
}
;
int[] rgbInt = ColorConverter.normalizeRGB(ColorConverter.HSLtoRGB((float)((float)hsl.getHue()/65535.0f), (float)((float)hsl.getSat()/254.0f), (float)((float)hsl.getBri()/254)));
rgb = new ArrayList<Integer>();
rgb.add((int) Math.round(r));
rgb.add((int) Math.round(g));
rgb.add((int) Math.round(b));
rgb.add(rgbInt[0]);
rgb.add(rgbInt[1]);
rgb.add(rgbInt[2]);
log.debug("Color change with HSL: " + hsl + ". Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + " "
log.info("Color change with HSL: " + hsl + ". Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + " "
+ rgb.get(2));
return rgb;
}
public static float hue_2_rgb(float v1, float v2, float vh) {
log.debug("hue_2_rgb vh: " + vh);
if (vh < 0.0) {
vh = vh + (float) 1;
}
;
if (vh > 1.0) {
vh = vh - (float) 1;
}
;
if (((float) 6.0 * vh) < 1.0) {
return (v1 + (v2 - v1) * (float) 6.0 * vh);
}
;
if (((float) 2.0 * vh) < 1.0) {
return (v2);
}
;
if ((3.0 * vh) < 2.0) {
return (v1 + (v2 - v1) * (((float) 2.0 / (float) 3.0 - vh) * (float) 6.0));
}
;
return (v1);
}
public static List<Integer> convertCIEtoRGB(List<Double> xy, int brightness) {
List<Integer> rgb;
double x = xy.get(0); // the given x value
double y = xy.get(1); // the given y value
double z = 1.0f - x - y;
double Y = (double) brightness / (double) 254.00f; // The given brightness value
double X = (Y / y) * x;
double Z = (Y / y) * z;
double r = X * 1.656492f - Y * 0.354851f - Z * 0.255038f;
double g = -X * 0.707196f + Y * 1.655397f + Z * 0.036152f;
double b = X * 0.051713f - Y * 0.121364f + Z * 1.011530f;
if (r > b && r > g && r > 1.0f) {
g = g / r;
b = b / r;
r = 1.0f;
} else if (g > b && g > r && g > 1.0f) {
r = r / g;
b = b / g;
g = 1.0f;
} else if (b > r && b > g && b > 1.0f) {
r = r / b;
g = g / b;
b = 1.0f;
}
r = r <= 0.0031308f ? 12.92f * r : (1.0f + 0.055f) * Math.pow(r, (1.0f / 2.4f)) - 0.055f;
g = g <= 0.0031308f ? 12.92f * g : (1.0f + 0.055f) * Math.pow(g, (1.0f / 2.4f)) - 0.055f;
b = b <= 0.0031308f ? 12.92f * b : (1.0f + 0.055f) * Math.pow(b, (1.0f / 2.4f)) - 0.055f;
if (r > b && r > g) {
// red is biggest
if (r > 1.0f) {
g = g / r;
b = b / r;
r = 1.0f;
}
} else if (g > b && g > r) {
// green is biggest
if (g > 1.0f) {
r = r / g;
b = b / g;
g = 1.0f;
}
} else if (b > r && b > g) {
// blue is biggest
if (b > 1.0f) {
r = r / b;
g = g / b;
b = 1.0f;
}
}
if (r < 0.0f)
r = 0.0f;
if (g < 0.0f)
g = 0.0f;
if (b < 0.0f)
b = 0.0f;
XYColorSpace xyColor = new XYColorSpace();
xyColor.setBrightness(brightness);
float[] xyFloat = new float[2];
xyFloat[0] = xy.get(0).floatValue();
xyFloat[1] = xy.get(1).floatValue();
xyColor.setXy(xyFloat);
float[] xyz = ColorConverter.XYtoXYZ(xyColor);
int[] rgbInt = ColorConverter.normalizeRGB(ColorConverter.XYZtoRGB(xyz[0], xyz[1], xyz[2]));
rgb = new ArrayList<Integer>();
rgb.add((int) Math.round(r * 255));
rgb.add((int) Math.round(g * 255));
rgb.add((int) Math.round(b * 255));
log.debug("Color change with XY: " + x + " " + y + " Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1)
rgb.add(rgbInt[0]);
rgb.add(rgbInt[1]);
rgb.add(rgbInt[2]);
log.debug("Color change with XY: " + xy.get(0) + " " + xy.get(1) + " Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1)
+ " " + rgb.get(2));
return rgb;
}

View File

@@ -9,48 +9,90 @@ import org.junit.Test;
import com.bwssystems.HABridge.hue.ColorData;
import com.bwssystems.HABridge.hue.ColorDecode;
import com.bwssystems.HABridge.hue.HueSatBri;
import com.bwssystems.HABridge.hue.XYColorSpace;
import com.bwssystems.HABridge.hue.ColorConverter;
public class ConvertCIEColorTestCase {
@Test
public void testColorConversion() {
public void testColorConverterXYtoRGB() {
ArrayList<Double> xy = new ArrayList<Double>(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273")));
XYColorSpace xyColor = new XYColorSpace();
xyColor.setBrightness(254);
xyColor.setBrightness(50);
float[] xyFloat = new float[2];
xyFloat[0] = xy.get(0).floatValue();
xyFloat[1] = xy.get(1).floatValue();
xyColor.setXy(xyFloat);
float[] xyz = ColorConverter.XYtoXYZ(xyColor);
int[] rgb = ColorConverter.XYZtoRGB(xyz[0], xyz[1], xyz[2]);
int[] rgb = ColorConverter.normalizeRGB(ColorConverter.XYZtoRGB(xyz[0], xyz[1], xyz[2]));
List<Integer> rgbDecode = new ArrayList<Integer>();
rgbDecode.add(0, rgb[0]);
rgbDecode.add(1, rgb[1]);
rgbDecode.add(2, rgb[2]);
List<Integer> assertDecode = new ArrayList<Integer>();
assertDecode.add(0, 255);
assertDecode.add(1, 47);
assertDecode.add(2, 43);
assertDecode.add(1, 0);
assertDecode.add(2, 5);
Assert.assertEquals(rgbDecode, assertDecode);
}
@Test
public void testColorConversionRGB() {
ArrayList<Double> xy = new ArrayList<Double>(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273")));
List<Integer> colorDecode = ColorDecode.convertCIEtoRGB(xy, 254);
public void testColorConverterHSLtoRGB() {
int[] rgb = ColorConverter.normalizeRGB(ColorConverter.HSLtoRGB(0.0f, 1.0f, 0.50000f));
List<Integer> rgbDecode = new ArrayList<Integer>();
rgbDecode.add(0, rgb[0]);
rgbDecode.add(1, rgb[1]);
rgbDecode.add(2, rgb[2]);
List<Integer> assertDecode = new ArrayList<Integer>();
assertDecode.add(0, 255);
assertDecode.add(1, 47);
assertDecode.add(2, 43);
assertDecode.add(1, 0);
assertDecode.add(2, 0);
Assert.assertEquals(rgbDecode, assertDecode);
}
@Test
public void testColorConversionXYtoRGB() {
ArrayList<Double> xy = new ArrayList<Double>(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273")));
List<Integer> colorDecode = ColorDecode.convertCIEtoRGB(xy, 50);
List<Integer> assertDecode = new ArrayList<Integer>();
assertDecode.add(0, 255);
assertDecode.add(1, 0);
assertDecode.add(2, 5);
Assert.assertEquals(colorDecode, assertDecode);
ColorData colorData = new ColorData(ColorData.ColorMode.XY, xy);
int rgbIntVal = ColorDecode.getIntRGB(colorData, 254);
Assert.assertEquals(rgbIntVal, 16723755);
int rgbIntVal = ColorDecode.getIntRGB(colorData, 50);
Assert.assertEquals(rgbIntVal, 16711685);
}
@Test
public void testColorConversionHSLtoRGB() {
HueSatBri hsb = new HueSatBri();
hsb.setHue(0);
hsb.setSat(254);
hsb.setBri((int)Math.round(0.50000 * 254));
List<Integer> colorDecode = ColorDecode.convertHSLtoRGB(hsb);
List<Integer> assertDecode = new ArrayList<Integer>();
assertDecode.add(0, 255);
assertDecode.add(1, 0);
assertDecode.add(2, 0);
Assert.assertEquals(colorDecode, assertDecode);
}
@Test
public void testColorConversionCTtoRGB() {
Integer ct = 500;
List<Integer> colorDecode = ColorDecode.convertCTtoRGB(ct);
List<Integer> assertDecode = new ArrayList<Integer>();
assertDecode.add(0, 255);
assertDecode.add(1, 214);
assertDecode.add(2, 73);
Assert.assertEquals(colorDecode, assertDecode);
}
}