mirror of
https://github.com/bwssytems/ha-bridge.git
synced 2025-12-18 16:17:30 +00:00
Updated color conversions and tests
This commit is contained in:
@@ -939,4 +939,25 @@ public class ColorConverter {
|
|||||||
return xyz;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -30,162 +30,32 @@ public class ColorDecode {
|
|||||||
|
|
||||||
public static List<Integer> convertHSLtoRGB(HueSatBri hsl) {
|
public static List<Integer> convertHSLtoRGB(HueSatBri hsl) {
|
||||||
List<Integer> rgb;
|
List<Integer> rgb;
|
||||||
float decimalBrightness = (float) 0.0;
|
int[] rgbInt = ColorConverter.normalizeRGB(ColorConverter.HSLtoRGB((float)((float)hsl.getHue()/65535.0f), (float)((float)hsl.getSat()/254.0f), (float)((float)hsl.getBri()/254)));
|
||||||
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);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
rgb = new ArrayList<Integer>();
|
rgb = new ArrayList<Integer>();
|
||||||
rgb.add((int) Math.round(r));
|
rgb.add(rgbInt[0]);
|
||||||
rgb.add((int) Math.round(g));
|
rgb.add(rgbInt[1]);
|
||||||
rgb.add((int) Math.round(b));
|
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));
|
+ rgb.get(2));
|
||||||
return rgb;
|
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) {
|
public static List<Integer> convertCIEtoRGB(List<Double> xy, int brightness) {
|
||||||
List<Integer> rgb;
|
List<Integer> rgb;
|
||||||
double x = xy.get(0); // the given x value
|
XYColorSpace xyColor = new XYColorSpace();
|
||||||
double y = xy.get(1); // the given y value
|
xyColor.setBrightness(brightness);
|
||||||
double z = 1.0f - x - y;
|
float[] xyFloat = new float[2];
|
||||||
double Y = (double) brightness / (double) 254.00f; // The given brightness value
|
xyFloat[0] = xy.get(0).floatValue();
|
||||||
double X = (Y / y) * x;
|
xyFloat[1] = xy.get(1).floatValue();
|
||||||
double Z = (Y / y) * z;
|
xyColor.setXy(xyFloat);
|
||||||
|
float[] xyz = ColorConverter.XYtoXYZ(xyColor);
|
||||||
double r = X * 1.656492f - Y * 0.354851f - Z * 0.255038f;
|
int[] rgbInt = ColorConverter.normalizeRGB(ColorConverter.XYZtoRGB(xyz[0], xyz[1], xyz[2]));
|
||||||
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;
|
|
||||||
|
|
||||||
rgb = new ArrayList<Integer>();
|
rgb = new ArrayList<Integer>();
|
||||||
rgb.add((int) Math.round(r * 255));
|
rgb.add(rgbInt[0]);
|
||||||
rgb.add((int) Math.round(g * 255));
|
rgb.add(rgbInt[1]);
|
||||||
rgb.add((int) Math.round(b * 255));
|
rgb.add(rgbInt[2]);
|
||||||
log.debug("Color change with XY: " + x + " " + y + " Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1)
|
log.debug("Color change with XY: " + xy.get(0) + " " + xy.get(1) + " Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1)
|
||||||
+ " " + rgb.get(2));
|
+ " " + rgb.get(2));
|
||||||
return rgb;
|
return rgb;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,48 +9,90 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import com.bwssystems.HABridge.hue.ColorData;
|
import com.bwssystems.HABridge.hue.ColorData;
|
||||||
import com.bwssystems.HABridge.hue.ColorDecode;
|
import com.bwssystems.HABridge.hue.ColorDecode;
|
||||||
|
import com.bwssystems.HABridge.hue.HueSatBri;
|
||||||
import com.bwssystems.HABridge.hue.XYColorSpace;
|
import com.bwssystems.HABridge.hue.XYColorSpace;
|
||||||
import com.bwssystems.HABridge.hue.ColorConverter;
|
import com.bwssystems.HABridge.hue.ColorConverter;
|
||||||
|
|
||||||
public class ConvertCIEColorTestCase {
|
public class ConvertCIEColorTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testColorConversion() {
|
public void testColorConverterXYtoRGB() {
|
||||||
ArrayList<Double> xy = new ArrayList<Double>(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273")));
|
ArrayList<Double> xy = new ArrayList<Double>(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273")));
|
||||||
|
|
||||||
XYColorSpace xyColor = new XYColorSpace();
|
XYColorSpace xyColor = new XYColorSpace();
|
||||||
xyColor.setBrightness(254);
|
xyColor.setBrightness(50);
|
||||||
float[] xyFloat = new float[2];
|
float[] xyFloat = new float[2];
|
||||||
xyFloat[0] = xy.get(0).floatValue();
|
xyFloat[0] = xy.get(0).floatValue();
|
||||||
xyFloat[1] = xy.get(1).floatValue();
|
xyFloat[1] = xy.get(1).floatValue();
|
||||||
xyColor.setXy(xyFloat);
|
xyColor.setXy(xyFloat);
|
||||||
float[] xyz = ColorConverter.XYtoXYZ(xyColor);
|
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>();
|
List<Integer> rgbDecode = new ArrayList<Integer>();
|
||||||
rgbDecode.add(0, rgb[0]);
|
rgbDecode.add(0, rgb[0]);
|
||||||
rgbDecode.add(1, rgb[1]);
|
rgbDecode.add(1, rgb[1]);
|
||||||
rgbDecode.add(2, rgb[2]);
|
rgbDecode.add(2, rgb[2]);
|
||||||
List<Integer> assertDecode = new ArrayList<Integer>();
|
List<Integer> assertDecode = new ArrayList<Integer>();
|
||||||
assertDecode.add(0, 255);
|
assertDecode.add(0, 255);
|
||||||
assertDecode.add(1, 47);
|
assertDecode.add(1, 0);
|
||||||
assertDecode.add(2, 43);
|
assertDecode.add(2, 5);
|
||||||
Assert.assertEquals(rgbDecode, assertDecode);
|
Assert.assertEquals(rgbDecode, assertDecode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testColorConversionRGB() {
|
public void testColorConverterHSLtoRGB() {
|
||||||
ArrayList<Double> xy = new ArrayList<Double>(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273")));
|
int[] rgb = ColorConverter.normalizeRGB(ColorConverter.HSLtoRGB(0.0f, 1.0f, 0.50000f));
|
||||||
|
List<Integer> rgbDecode = new ArrayList<Integer>();
|
||||||
List<Integer> colorDecode = ColorDecode.convertCIEtoRGB(xy, 254);
|
rgbDecode.add(0, rgb[0]);
|
||||||
|
rgbDecode.add(1, rgb[1]);
|
||||||
|
rgbDecode.add(2, rgb[2]);
|
||||||
List<Integer> assertDecode = new ArrayList<Integer>();
|
List<Integer> assertDecode = new ArrayList<Integer>();
|
||||||
assertDecode.add(0, 255);
|
assertDecode.add(0, 255);
|
||||||
assertDecode.add(1, 47);
|
assertDecode.add(1, 0);
|
||||||
assertDecode.add(2, 43);
|
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);
|
Assert.assertEquals(colorDecode, assertDecode);
|
||||||
|
|
||||||
ColorData colorData = new ColorData(ColorData.ColorMode.XY, xy);
|
ColorData colorData = new ColorData(ColorData.ColorMode.XY, xy);
|
||||||
int rgbIntVal = ColorDecode.getIntRGB(colorData, 254);
|
int rgbIntVal = ColorDecode.getIntRGB(colorData, 50);
|
||||||
Assert.assertEquals(rgbIntVal, 16723755);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user