美文网首页
Android RGB与HSB互转颜色值

Android RGB与HSB互转颜色值

作者: h2coder | 来源:发表于2022-08-03 20:54 被阅读0次

概念

  • RGB色彩模式

    • RGB色彩模式,即R:Red(红),G:Green(绿),B:Blue(蓝),3个颜色通道值的大小和层叠来得到各式各样的颜色。
  • HSB色彩模式

    • HSB色彩模式,即色度、饱和度、亮度模式。它采用颜色的三属性来表色。H:hue,即色调(色度),S:saturation(饱和度),B:brightness明度(亮度)。
    • 其中,S和B,饱和度和亮度,值为百分比(0% ~ 100%)。而色度,以角度(0°-360°)来表示。

既然有了RGB,为何还需要HSB?

众所周知,人眼所能看见的颜色都可以通过三原色RGB混合获得,其每个颜色分量分别为红(R)、绿(G)、蓝(B)。然而这只是颜色一种表示方法,这种表示方法非常适合机器却非常的反人性。

转换工具类

/**
 * HSB和RGB颜色之间转换的工具类
 */
public class HSBColorUtil {
    private HSBColorUtil() {
    }

    /**
     * RGB转HSB
     *
     * @param r       RBG的R
     * @param g       RBG的G
     * @param b       RBG的B
     * @param hsbvals HSB 3个值存放到这个数组
     * @return 返回HSB数组
     */
    public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) {
        float hue, saturation, brightness;
        if (hsbvals == null) {
            hsbvals = new float[3];
        }
        int cmax = (r > g) ? r : g;
        if (b > cmax) cmax = b;
        int cmin = (r < g) ? r : g;
        if (b < cmin) cmin = b;

        brightness = ((float) cmax) / 255.0f;
        if (cmax != 0)
            saturation = ((float) (cmax - cmin)) / ((float) cmax);
        else
            saturation = 0;
        if (saturation == 0)
            hue = 0;
        else {
            float redc = ((float) (cmax - r)) / ((float) (cmax - cmin));
            float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin));
            float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin));
            if (r == cmax)
                hue = bluec - greenc;
            else if (g == cmax)
                hue = 2.0f + redc - bluec;
            else
                hue = 4.0f + greenc - redc;
            hue = hue / 6.0f;
            if (hue < 0)
                hue = hue + 1.0f;
        }
        hsbvals[0] = hue;
        hsbvals[1] = saturation;
        hsbvals[2] = brightness;
        return hsbvals;
    }

    /**
     * HSB颜色值,转RGB
     *
     * @param hue        HSB的h,色调
     * @param saturation HSB的s,饱和度
     * @param brightness HSB的b,明度
     * @return 返回RGB值
     */
    public static int HSBtoRGB(float hue, float saturation, float brightness) {
        int r = 0, g = 0, b = 0;
        if (saturation == 0) {
            r = g = b = (int) (brightness * 255.0f + 0.5f);
        } else {
            float h = (hue - (float) Math.floor(hue)) * 6.0f;
            float f = h - (float) java.lang.Math.floor(h);
            float p = brightness * (1.0f - saturation);
            float q = brightness * (1.0f - saturation * f);
            float t = brightness * (1.0f - (saturation * (1.0f - f)));
            switch ((int) h) {
                case 0:
                    r = (int) (brightness * 255.0f + 0.5f);
                    g = (int) (t * 255.0f + 0.5f);
                    b = (int) (p * 255.0f + 0.5f);
                    break;
                case 1:
                    r = (int) (q * 255.0f + 0.5f);
                    g = (int) (brightness * 255.0f + 0.5f);
                    b = (int) (p * 255.0f + 0.5f);
                    break;
                case 2:
                    r = (int) (p * 255.0f + 0.5f);
                    g = (int) (brightness * 255.0f + 0.5f);
                    b = (int) (t * 255.0f + 0.5f);
                    break;
                case 3:
                    r = (int) (p * 255.0f + 0.5f);
                    g = (int) (q * 255.0f + 0.5f);
                    b = (int) (brightness * 255.0f + 0.5f);
                    break;
                case 4:
                    r = (int) (t * 255.0f + 0.5f);
                    g = (int) (p * 255.0f + 0.5f);
                    b = (int) (brightness * 255.0f + 0.5f);
                    break;
                case 5:
                    r = (int) (brightness * 255.0f + 0.5f);
                    g = (int) (p * 255.0f + 0.5f);
                    b = (int) (q * 255.0f + 0.5f);
                    break;
            }
        }
        return 0xff000000 | (r << 16) | (g << 8) | (b << 0);
    }
}

示例

  • 字符串颜色值转RBG值
/**
 * 字符串颜色值转int颜色值
 */
private static int colorStr2Int(String colorStr) {
    try {
        return Color.parseColor(colorStr);
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }
}
  • RGB转HSB数组
/**
 * RGB颜色值转HSB颜色值,返回HSB颜色值的3个值数组
 */
private static float[] colorInt2HSB(int colorInt) {
    float[] hsbArr = new float[3];
    hsbArr = HSBColorUtil.RGBtoHSB(
            Color.red(colorInt),
            Color.green(colorInt),
            Color.blue(colorInt),
            hsbArr
    );
    return hsbArr;
}
  • 将颜色值转HSB,并将B亮度乘以0.9(调暗),并转回RBG值
int themeColorInt = colorStr2Int("#314F62");
float[] hsbArr = colorInt2HSB(themeColorInt);

//色调
float hue = hsbArr[0];
//饱和度
float saturation = hsbArr[1];
//明度
float brightness = hsbArr[2];

//重点:对明度进行调整(调暗)
float newBrightness = (Math.round(brightness * 100f * 0.9f)) / 100f;

//把HSB转回RGB颜色返回
int result = HSBColorUtil.HSBtoRGB(hue, saturation, newBrightness);

相关文章

  • Android RGB与HSB互转颜色值

    概念 RGB色彩模式RGB色彩模式,即R:Red(红),G:Green(绿),B:Blue(蓝),3个颜色通道值的...

  • 前端JavaScript-十六进制颜色和RGB颜色值的相互转换

    十六进制颜色值和RGB颜色值的相互转换,在实际应用中并不鲜见。 颜色值返回的值是RGB格式,虽然没有错误,可能对于...

  • 颜色和色板(Color and Swatches)| Adobe

    一、颜色模式 1. RGB和CMYK 2.HSB 色谱框 HSB is for hue, saturation, ...

  • matalb 不同颜色空间转换

    %不同颜色空间转换 %{ RGB XYZ Yxy Luv HSV(又称HSB):(hue,saturation,v...

  • 【转】关于透明色值

    转自:Android 颜色透明度换算 简介 颜色 Android中的颜色值通常遵循RGB/ARGB标准,使用时通常...

  • 简单粗暴的配色野路子

    颜色模式的选取 颜色模式就是记录颜色的一种方式,分为很多种:RGB模式、CMYK模式、HSB模式、Lab颜色模式、...

  • 小工具集

    1.【CSS颜色】RGB转16进制色互转,16进制转rgb http://tool.css-js.com/rgb...

  • CSS颜色

    颜色 颜色值的常用表示方式 十六进制色 RGB 颜色 RGBA 颜色 RGBA 颜色值是 RGB 颜色值的扩展,带...

  • Illustrator颜色编辑

    一、颜色转换 超出色域的颜色转换为可打印的颜色 由于RGB和HSB颜色模型中的一些颜色在CMYK中没有等同的颜色,...

  • Illustrator颜色定义

    颜色模型 定义用来描述数字图形中看到和用到的各种颜色。用数值表示可见色度。包括:RGB、CMYK、HSB 色彩空间...

网友评论

      本文标题:Android RGB与HSB互转颜色值

      本文链接:https://www.haomeiwen.com/subject/pasewrtx.html