什么颜色混合算法用于使颜色变暗?
我有这些卡片有两种颜色的色调。 主色,然后是更暗的强调色:
主要颜色以hex给出,但不是重音。 你能说出主色的ARGB正在进行什么样的混合或转换才能获得更暗的强调色?
如果它很重要,我正在开发Android,所以我可以访问Color类和ColorFilter,所以我可以应用所有的PorterDuff东西……
如果你想要更暗的Color
,你可以:
- 使用
RGBToHSV()
将RGB转换为HSV。 - 降低V(亮度值)。 它是
hsv[2]
,一个值为0到1的浮点数。 - 使用
HSVToColor()
将HSV转换为Color
。
如果你想要更暗的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; }
只需这样做:
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颜色变暗的另一种方法。 如下:
- 使用
RGBToHSV()
方法将颜色的RGB转换为HSV - 使用浮动因子减少V(亮度值)。 它位于
hsv[2]
,浮点数的范围为0到1。 - 使用
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;