Как программно добавить оттенок к заданному цвету? - PullRequest
2 голосов
/ 22 марта 2011

Я пытался реализовать свой редактор цвета на Java. Это должно быть простое программное обеспечение. Пользователь будет вводить цвет в шестнадцатеричных RGB, например: 0xFF00FF. Я знаю, как рассчитать оттенок, цветность, насыщенность и яркость, но как добавить или вычесть значение оттенка для данного цвета? Это загадка.

Есть ли какой-нибудь алгоритм или формула для использования?

Сейчас я использую этот метод, но я думаю, что результат отличается от того, что я получил в Adobe Photoshop.

public void addHue(float addHue) {
    float c = getChroma();
    addHue %= 6;
    if (addHue < 2) {
        float n = 1 - green;
        green = green + addHue * n;
    } else if (addHue < 4) {
        addHue -= 2;
        float n = 1 - blue;
        blue = blue + addHue * n;
    } else if (addHue < 6) {
        addHue -=4;
        float n = 1 - red;
        red = red + addHue * n;
    }
    if (green > 1) green = 1;
    else if (green < 0) green = 0;
    if (red > 1) red = 1;
    else if (red < 0) red = 0;
    if (blue > 1) blue = 1;
    else if (blue < 0) blue = 0;
}

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Я не совсем понимаю, чего вы пытаетесь достичь, сложив вместе два оттенка.

Оттенок - это угол, дающий «оттенок» цвета, который вы представляете.Если вы думаете в градусах, оттенок будет в диапазоне [0, 360 [.Кроме того, значения 45 и 405. будут представлять один и тот же оттенок.

Вы должны принять это во внимание, когда хотите манипулировать оттенками.То есть, если вы хотите усреднить два значения, например 355 и 5, правильный результат может быть 0 (нарисуйте круг и взять наименьший половинный угол между этими двумя значениями) или 180 (наибольший половинный угол).


Как я это сделал на Android (у которого нет утилит управления цветом), чтобы создать свой собственный цветовой класс, который хранит оба представления цвета (rgb и hsv).

Тогда яесть методы, которые позволяют установить RGB или установить HSV.Добавление в том же цветовом пространстве тривиально.Затем каждый раз, когда эти методы вызываются, я соответственно вызываю метод updateHSV или updateRGB, который вычисляет компоненты цвета из новых значений.

class Color {
  float[] hsv;
  float[] rgb;

  public void setRgb(float[] rgb) {
    System.arraycopy(rgb, 0, this.rgb, 0, 3);
    computeHsvFromRgb();
  }

  public void setHsv(float[] hsv) {
    System.arraycopy(hsv, 0, this.hsv, 0, 3);
    computeRgbFromHsv();
  }

  // ...
}

Для примера кода преобразования цвета:

1 голос
/ 22 марта 2011

Класс java.awt.Color может помочь с этим.

...