【问题标题】:What color blending algorithm is used to darken a color?什么颜色混合算法用于使颜色变暗?
【发布时间】:2013-08-29 03:05:15
【问题描述】:

我有这些卡片,上面有两种颜色。主色,然后是较深的强调色:

主颜色是十六进制的,而不是重音。你能说出对主色的 ARGB 进行了什么样的混合或变换以获得更深的强调色吗?

如果重要的话,我正在针对 Android 进行开发,所以我可以访问 Color 类和 ColorFilter,这样我就可以应用所有 PorterDuff 的东西...

【问题讨论】:

  • 转为HSL,缩小L,转回RGB

标签: java android colors


【解决方案1】:

我看看提供的答案。他们很棒。但这是在 Android 中加深 int 颜色的另一种方法。如下:

  1. 使用 RGBToHSV() 方法将颜色的 RGB 转换为 HSV
  2. 使用浮点因子降低 V(亮度值)。它在hsv[2] 中,浮点数范围从 0 到 1。
  3. 使用HSVToColor()方法将HSV转换为Color,然后返回

这是sn-p:

public static int getDarkerColor(int color, float factor) {
    float[] hsv = new float[3];
    Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color), hsv);
    hsv[2] = hsv[2] * factor;
    return  Color.HSVToColor(hsv);
}

请注意,当您给factor 0.9f 时,您希望以 10% ((1-0.9) * 100) 的比率使输入颜色变暗。

【讨论】:

    【解决方案2】:

    使用此代码,如果因子 1,结果颜色会更亮。

    public static int alterColor(int color, float factor) {
        int a = (color & (0xFF << 24)) >> 24;
        int r = (int) (((color & (0xFF << 16)) >> 16) * factor);
        int g = (int) (((color & (0xFF << 8)) >> 8) * factor);
        int b = (int) ((color & 0xFF) * factor);
        return Color.argb(a, r, g, b);
    }
    

    【讨论】:

      【解决方案3】:

      只需这样做:

      int color = ....
      
      int r = Color.red(color);
      int b = Color.blue(color);
      int g = Color.green(color);
      
      int darkerColor =  Color.rgb((int)(r*.9), (int)(g*.9), (int)(b*.9));
      

      【讨论】:

        【解决方案4】:

        要使颜色变暗,您只需从红色绿色和蓝色成分中去除相同的量。

        编辑:由于您从十六进制值中获取颜色,因此您需要将组件从中分离出来,减小其值并将其放回。

        0xaarrggbb -> a = 阿尔法 r = 红色 g = 绿色 b = 蓝色

        int color = 0xff445566;
        
        // Get the color component:
        int alpha |= a << 24;
        int red |= r << 16;
        int green |= g << 8;
        int blue |= b;
        
        int newalpha = alpha;
        int newred = red - proportional amount ;
        int newgreen = green - proportional amount ;
        int newblue = blue - proportional amount ;
        
        
        // Set the color component
        color = (color & ~(0xFF << 24)) | (newalpha << 24);
        color = (color & ~(0xFF << 16)) | (newred << 16);
        color = (color & ~(0xFF << 8)) | (newgreen << 8);
        color = (color & ~0xFF) | newblue;
        

        【讨论】:

        • 为了更准确,您希望删除每个 r,g,b 的 proportional 量。如果您的原始颜色是20,80,200,则从每个颜色中取 10 不会简单地变暗。它也会改变色调。不过,对于这种情况,HSV/HSL 通常是更好的色彩空间。
        • 感谢您的帮助!
        • 比例金额为真 - 已修改,因此至少答案是有效的。 =)
        【解决方案5】:

        java.awt.Color.darker() 将每个 0-255 分量(R、G、B)乘以 0.7,然后将其转换回 int

        【讨论】:

        • 是的,但是android.graphics.Color没有类似的方法。
        【解决方案6】:

        如果你想要更深的Color,你可以:

        1. 使用 RGBToHSV() 将 RGB 转换为 HSV。
        2. 降低 V(亮度值)。它是hsv[2],一个从 0 到 1 的浮点数。
        3. 使用 HSVToColor() 将 HSV 转换为 Color

        如果你想要更深的BitmapPorterDuff.Mode.DARKEN 应该可以工作。你只需要校准COLOR值:

        private Bitmap getDarkerBitmap(Bitmap src)
        {
            final int COLOR = 0xAAFFFFFF;
            final int WIDTH = src.getWidth();
            final int HEIGHT = src.getHeight();
            final Bitmap result = Bitmap.createBitmap(WIDTH, HEIGHT, src.getConfig());
        
            final BitmapDrawable drawable = new BitmapDrawable(src);
            drawable.setBounds(0, 0, WIDTH, HEIGHT);
            drawable.setColorFilter(COLOR, PorterDuff.Mode.DARKEN);
            drawable.draw(new Canvas(result));
        
            return result;
        }
        

        【讨论】:

        • 完美,我想我只是猜测并检查 V 值,直到我得到足够接近的颜色。谢谢。
        • 仅供参考,这对我很有用。我只是将 V 值降低了 50%,这是颜色匹配的一个亮点!再次感谢亚当。
        猜你喜欢
        • 1970-01-01
        • 2018-12-23
        • 2016-02-12
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        相关资源
        最近更新 更多