• 颜色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}")
        }
    

      

     

     

  • 相关阅读:
    4.父类私有属性和方法
    3.单继承和方法的重写
    2.Python封装练习及私有属性
    1.Python面向对象基础
    6.类与对象、封装、构造方法
    5.数组
    4.方法
    3.流程控制语句
    结构型模式和物理视图,模型管理试图的总结
    创建型模式和关于状态视图、活动视图、交互视图的总结
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/15990617.html
Copyright © 2020-2023  润新知