2008-08-26 5 views
26

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

ответ

35

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

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

Там в another question, связанные с этим.

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

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

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

+2

В Java 1.6 и выше, есть также LinearGradientPaint, что позволяет больше контроля над тем, как его малюют. См. Http://java.sun.com/javase/6/docs/api/java/awt/LinearGradientPaint.html – Avrom 2009-05-10 19:38:25

7

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

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

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

+0

Страница недоступна ........ – hyprfrcb 2015-04-13 02:26:35

1

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

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 
    ) 
} 
Смежные вопросы