Получите более темный цвет по фактору, учитывая цвет Int

Вот как я получаю более светлый цвет с учетом 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);
}

1 ответ

Учитывая только красный канал (поскольку логика для остальных идентична):

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новый цвет черный.
Другие вопросы по тегам