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

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

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

如果它很重要,我正在开发Android,所以我可以访问Color类和ColorFilter,所以我可以应用所有的PorterDuff东西……

在此处输入图像描述

如果你想要更暗的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; } 

只需这样做:

 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)); 

使用此代码,如果因子<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); } 

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

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

这是片段:

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

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

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

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

0xaarrggbb – > 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;