Подтвердить что ты не робот

Создание градиентов программным путем?

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

4b9b3361

Ответ 1

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

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

Здесь другой вопрос, связанный с этим.

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

/EDIT: Ой, вы имеете в виду использование предопределенной функции. Хорошо, еще проще. В блоге, которое вы связали сейчас, есть пример кода в Python.

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

Ответ 2

Вы можете использовать встроенный класс 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);
}

Ответ 3

Используя основные классы 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);
        }
    }
}

Ответ 4

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

Ответ 5

Следуя за исполненным ответом Дэвида Кроу, здесь реализован пример реализации 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
    )
}