Вопрос

Учитывая 2 цвета rgb и прямоугольную область, я бы хотел сгенерировать базовый линейный градиент между цветами.Я провел быстрый поиск, и единственное, что мне удалось найти, это эта запись в блоге, но пример кода, похоже, отсутствует, или, по крайней мере, так было на момент этой публикации.Все, что помогает, алгоритмы, примеры кода, что угодно.Это будет написано на Java, но уровень отображения уже обработан, мне просто нужно выяснить, как определить, что отображать.

Это было полезно?

Решение

вам нужна интерполяция между первым и вторым цветом.Интерполировать цвета легко, если вычислить одинаковую интерполяцию для каждого из его компонентов (R, G, B).Существует много способов интерполяции.Проще всего использовать линейную интерполяцию:просто возьмите процент p первого цвета и процентное содержание 1 - p из второго:

R = firstCol.R * p + secondCol.R * (1 - p)

Там есть еще один вопрос связанный с этим.

Существуют другие методы интерполяции, которые иногда работают лучше.Например, используя колоколообразный (сигмоидальный) функция интерполяции делает переход более плавным.

/РЕДАКТИРОВАТЬ:Упс, ты имеешь в виду использование предопределенной функции.Хорошо, еще проще.Запись в блоге, на которую вы ссылались, теперь содержит пример кода на Python.

В Java вы могли бы использовать GradientPaint.

Другие советы

Вы можете использовать встроенный Градиентная краска класс.

void Paint(Graphics2D g, Regtangle r, Color c1, Color c2)
{
  GradientPaint gp = new GradientPaint(0,0,c1,r.getWidth(),r.getHeight(),c2); 
  g.setPaint(gp);
  g.fill(rect);
}

Используя базовые классы AWT, вы могли бы сделать что-то вроде этого:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;

public class LinearGradient extends JPanel {

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        Color color1 = Color.RED;
        Color color2 = Color.BLUE;
        int steps = 30;
        int rectWidth = 10;
        int rectHeight = 10;

        for (int i = 0; i < steps; i++) {
            float ratio = (float) i / (float) steps;
            int red = (int) (color2.getRed() * ratio + color1.getRed() * (1 - ratio));
            int green = (int) (color2.getGreen() * ratio + color1.getGreen() * (1 - ratio));
            int blue = (int) (color2.getBlue() * ratio + color1.getBlue() * (1 - ratio));
            Color stepColor = new Color(red, green, blue);
            Rectangle2D rect2D = new Rectangle2D.Float(rectWidth * i, 0, rectWidth, rectHeight);
            g2.setPaint(stepColor);
            g2.fill(rect2D);
        }
    }
}

Следуя последнему ответу Дэвида Кроу, вот пример реализации Kotlin

fun gradientColor(x: Double, minX: Double, maxX: Double, 
                  from: Color = Color.RED, to: Color = Color.GREEN): Color {
    val range = maxX - minX
    val p = (x - minX) / range

   return Color(
        from.red * p + to.red * (1 - p),
        from.green * p + to.green * (1 - p),
        from.blue * p + to.blue * (1 - p),
        1.0
    )
}

Я использовал RMagick для этого.Если вам нужно перейти к простому градиенту, ImageMagick и одной из его оболочек (например, RMagick или ДЖмагик для Java) могло бы быть полезно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top