以下是给出int的更轻的颜色。但我想知道如何将其转换为更深的颜色?
我应该如何修改下面的方法以获得更深的颜色?
public static int getLighterColorByValue(int color, float factor) {
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
return Color.argb(Color.alpha(color), red, green, blue);
}
答案 0 :(得分:2)
仅考虑红色通道(因为其他通道的逻辑相同):
int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
您正在计算当前红色通道与255(全强度)之间的加权和。简而言之:
int newRed = (1 - factor) * oldRed + factor * 255;
因此,不是以全强度混合,而是以零强度混合:
int newRed = (1 - factor) * oldRed + factor * 0;
或更简单地说:
int newRed = (1 - factor) * oldRed;
因此,使用原始代码的格式,只需删除+ factor
:
int red = (int) ((Color.red(color) * (1 - factor) / 255) * 255);
但由于1 - factor
是float
,除以255并乘以255会再次返回相同的数字。所以,更简单:
int red = (int) ((Color.red(color) * (1 - factor));
int green = (int) ((Color.green(color) * (1 - factor));
int blue = (int) ((Color.blue(color) * (1 - factor));
完整性检查:
factor == 0
,则新颜色与原始颜色相同factor == 1
,(1 - factor) == 0
,red == green == blue == 0
,即新颜色为黑色。