什么颜色混合算法用于使颜色变暗?

时间:2013-08-26 15:06:03

标签: java android colors

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

主要颜色以十六进制给出,但不是重音。你能说出主色的ARGB正在进行什么样的混合或转换才能获得更暗的强调色?

如果重要,我会针对Android进行开发,因此我可以访问Color类和ColorFilter,因此我可以应用所有PorterDuff内容......

enter image description here

6 个答案:

答案 0 :(得分:5)

如果你想要更暗Color,你可以:

  1. 使用RGBToHSV()将您的RGB转换为HSV。
  2. 降低V(亮度值)。它是hsv[2],一个值为0到1的浮点数。
  3. 使用HSVToColor()将HSV转换为Color
  4. 如果你想要更暗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;
    }
    

答案 1 :(得分:2)

只需这样做:

f(x) = -d^T x + 1/2 x^T D x
where, d: coefficient *vector* for linear part of obj. function
       D: coefficient *matrix* for quadratic
       x: decision variable *vector*
and where ^T denotes the vector transpose.

答案 2 :(得分:2)

使用此代码,if if< 1,结果颜色会更暗,如果因素> 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 :(得分:2)

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

  1. 使用RGBToHSV()方法
  2. 将颜色的RGB转换为HSV
  3. 使用浮动因子减少V(亮度值)。它在hsv[2]中,浮点数的范围是0到1.
  4. 使用HSVToColor()方法将HSV转换为Color,然后返回
  5. 这是片段:

    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)的速率使输入颜色变暗。

答案 4 :(得分:0)

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

编辑:由于您从十六进制值中获取颜色,因此需要将组件与其分开,减小其值并将其重新放入。

0xaarrggbb - &gt; a = alpha 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;

答案 5 :(得分:0)

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