【发布时间】:2013-08-29 03:05:15
【问题描述】:
我有这些卡片,上面有两种颜色。主色,然后是较深的强调色:
主颜色是十六进制的,而不是重音。你能说出对主色的 ARGB 进行了什么样的混合或变换以获得更深的强调色吗?
如果重要的话,我正在针对 Android 进行开发,所以我可以访问 Color 类和 ColorFilter,这样我就可以应用所有 PorterDuff 的东西...
【问题讨论】:
-
转为HSL,缩小L,转回RGB
我有这些卡片,上面有两种颜色。主色,然后是较深的强调色:
主颜色是十六进制的,而不是重音。你能说出对主色的 ARGB 进行了什么样的混合或变换以获得更深的强调色吗?
如果重要的话,我正在针对 Android 进行开发,所以我可以访问 Color 类和 ColorFilter,这样我就可以应用所有 PorterDuff 的东西...
【问题讨论】:
我看看提供的答案。他们很棒。但这是在 Android 中加深 int 颜色的另一种方法。如下:
RGBToHSV() 方法将颜色的 RGB 转换为 HSVhsv[2] 中,浮点数范围从 0 到 1。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) 的比率使输入颜色变暗。
【讨论】:
使用此代码,如果因子 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);
}
【讨论】:
只需这样做:
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));
【讨论】:
要使颜色变暗,您只需从红色绿色和蓝色成分中去除相同的量。
编辑:由于您从十六进制值中获取颜色,因此您需要将组件从中分离出来,减小其值并将其放回。
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;
【讨论】:
20,80,200,则从每个颜色中取 10 不会简单地变暗。它也会改变色调。不过,对于这种情况,HSV/HSL 通常是更好的色彩空间。
java.awt.Color.darker() 将每个 0-255 分量(R、G、B)乘以 0.7,然后将其转换回 int。
【讨论】:
android.graphics.Color没有类似的方法。
如果你想要更深的Color,你可以:
RGBToHSV() 将 RGB 转换为 HSV。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;
}
【讨论】: