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

4
我有一些卡片上有两种颜色。一种是主色,另一种是较深的强调色。
主色给出了16进制值,但强调色没有。您能告诉我是对主色的ARGB进行了何种混合或转换以获得较深的强调色吗?
如果相关的话,我正在开发Android应用程序,因此可以使用Color类和ColorFilter,并应用所有PorterDuff效果。 enter image description here

转换为HSL,降低L值,再转换回RGB。 - Esailija
6个回答

5
如果你想要更暗的颜色,可以:
  1. 使用RGBToHSV()将RGB转换为HSV。
  2. 减小V值(亮度值)。它是hsv[2],一个取值范围在0到1之间的浮点数。
  3. 使用HSVToColor()将HSV转换为颜色。
如果你想让Bitmap变暗, PorterDuff.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值,直到我得到足够接近的颜色。谢谢。 - joepetrakovich
FYI,这对我非常有效。我只是将V值减少了50%,颜色完美匹配!再次感谢,Adam。 - joepetrakovich

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

2

使用以下代码,如果因素<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);
}

2
我看了提供的答案,它们很棒。但是,这里有另一种在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);
}

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

0
要使颜色变暗,您只需要从红色、绿色和蓝色组件中删除相同的数量。
编辑:由于您从十六进制值获取颜色,因此需要将其组件分离出来,减少其值并将其放回。
0xaarrggbb -> a = alpha r = red g = green b = blue
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的比例。如果您的原始颜色是“20,80,200”,则从每个颜色通道中减去10不仅会使其变暗,还会改变色调。HSV/HSL通常更适合此类操作。 - Geobits
根据比例修改后,结果为真实的相应数量。=) - MasterPlanMan

0

java.awt.Color.darker() 方法将每个 0-255 组件(R、G、B)乘以 0.7,然后将其转换回 int 类型。


1
是的,但是 android.graphics.Color 没有类似的方法。 - Adam Stelmaszczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接