2016-01-06 48 views
1

這裏是我如何得到較輕的顏色給定一個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); 
} 

回答

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 - factorfloat,除以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,即新的顏色黑色。
+0

太棒了!按原樣工作。 – Tuby