颜色RGB和十六进制和HSV转换
1、RGB转十六进制
/* *转16进制数 //十六进制的颜色字符串 */ private fun toBrowserHexValue(number: Int): String { val builder = StringBuilder(Integer.toHexString(number and 0xff)) while (builder.length < 2) { builder.append("0") } return builder.toString().toUpperCase() } //十六进制的颜色字符串 var colorValue = "#" + toBrowserHexValue(r) + toBrowserHexValue(g) + toBrowserHexValue(b) Log.i("打印选择的颜色","$colorValue")
2、十六进制转RGB
Log.i("打印选择的值:","$colorValue")//#FF00FF var str = colorValue var str2 = str.substring(1,3) var str3 = str.substring(3,5) var str4 = str.substring(5,7) var red = Integer.parseInt(str2,16) var green = Integer.parseInt(str3,16) var blue = Integer.parseInt(str4,16) Log.i("打印十六进制转颜色值","r=$red,g=$green,b=$blue")
3、RGB转HSV
// 将 rgb 转换成 hsv,s 即为饱和度 色调(H),饱和度(S),明度(V) val c = Color.argb(255, red, green, blue) val hsv = FloatArray(3) Color.colorToHSV(c, hsv) Log.i("打印选择的值","R=${hsv[0]} ,G=${hsv[1]} ,B=${hsv[2]}") //var blue = hsv[2]
4、HSV转RGB
public static void HSVToRGB(float hsv[], @Size(3) float rgb[]){ int color=Color.HSVToColor(hsv); rgb[0]=Color.red(color); rgb[1]=Color.green(color); rgb[2]=Color.blue(color); // Color.colorToHSV(); }
5、通过RGB获取色温值
public static double setRGBToTemperature(int rgb_R,int rgb_G,int rgb_B) { double trimX = 0; double trimY = 0; double trimZ = 0; double coorX = 0, coorY = 0; double CCT = 0; double n = 0; int R = rgb_R;//255; int G = rgb_G;//231; int B = rgb_B;//131; //以下公式实现RGB转三刺激值 trimX = 2.789 * R + 1.7517 * G + 1.1302 * B; trimY = 1 * R + 4.5907 * G + 0.0601 * B; trimZ = 0 * R + 0.0565 * G + 5.5943 * B; //以下公式实现三刺激值转色坐标 coorX = trimX / (trimX + trimY + trimZ); coorY = trimY / (trimX + trimY + trimZ); n = (coorX - 0.3320) / (0.1858 - coorY); //以下公式实现色坐标转色温 CCT = 437 * n * n * n + 3601 * n * n + 6831 * n + 5517; System.out.println("X:" + trimX + "Y:" + trimY + "Z:" + trimZ+"\n CCT:"+CCT); return CCT; } //调用 val rgb = MyColorUtils.setRGBToTemperature(r,g,b) Log.i("RGB转色温值后:","$rgb") colorTempValue = "${(rgb).toInt()}K"
6、色温值转RGB
/** A temperature to color conversion, inspired from a blogpost from PhotoDemon (http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/). @param temperature The temperature of an ideal black body, in Kelvins; @param alpha If true, the return value will be RGBA instead of RGB. @return The corresponding RGB color. */ public static int[] getRgbFromTemperature(double temperature, boolean alpha) { // Temperature must fit between 1000 and 40000 degrees temperature = MathUtils.clamp(temperature, 1000, 40000); // All calculations require tmpKelvin \ 100, so only do the conversion once temperature /= 100; // Compute each color in turn. int red, green, blue; // First: red if (temperature <= 66) red = 255; else { // Note: the R-squared value for this approximation is .988 red = (int) (329.698727446 * (Math.pow(temperature - 60, -0.1332047592))); red = MathUtils.clamp(red, 0, 255); } // Second: green if (temperature <= 66) // Note: the R-squared value for this approximation is .996 green = (int) (99.4708025861 * Math.log(temperature) - 161.1195681661); else // Note: the R-squared value for this approximation is .987 green = (int) (288.1221695283 * (Math.pow(temperature - 60, -0.0755148492))); green = MathUtils.clamp(green, 0, 255); // Third: blue if (temperature >= 66) blue = 255; else if (temperature <= 19) blue = 0; else { // Note: the R-squared value for this approximation is .998 blue = (int) (138.5177312231 * Math.log(temperature - 10) - 305.0447927307); blue = MathUtils.clamp(blue, 0, 255); } if (alpha) return new int[] { red, green, blue, 255 }; else return new int[] { red, green, blue }; }
调用
fun setCenterColorFromColorTemp(color: String){//传入:2700K var zhi = color.replace("K", "").toDouble() Log.i("打印选择的值1:","$zhi") var rgb = IntArray(3) rgb = MyColorUtils.getRgbFromTemperature(zhi,false) Log.i("打印选择的值2","R=${rgb[0]} ,G=${rgb[1]} ,B=${rgb[2]}") var blue = rgb[2] val c = Color.argb(255,rgb[0], rgb[1], rgb[2]) Log.i("打印选择的值3","c=${c}") }