2008-08-26 13 views
26

Dado 2 colores rgb y un área rectangular, me gustaría generar un degradado lineal básico entre los colores. Hice una búsqueda rápida y lo único que he podido encontrar es this blog entry, pero parece que falta el código de ejemplo, o al menos era a partir de esta publicación. Cualquier cosa ayuda, algoritmos, ejemplos de código, lo que sea. Esto se escribirá en Java, pero la capa de visualización ya está solucionada, solo tengo que averiguar cómo averiguar qué mostrar.Generando gradientes programáticamente?

Respuesta

35

desea una interpolación entre el primer y el segundo color. La interpolación de colores es fácil al calcular la misma interpolación para cada uno de sus componentes (R, G, B). Hay muchas formas de interpolar. Lo más fácil es utilizar la interpolación lineal: acaba de tomar el porcentaje p del primer color y Porcentaje Puestos 1 - p de la segunda:

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

Hay another question relacionado con este.

Existen otros métodos de interpolación que a veces funcionan mejor. Por ejemplo, el uso de una función de interpolación bell-shaped (sigmoidal) hace que la transición sea más suave.

/EDITAR: Ups, te refieres a utilizar una función predefinida. OK, incluso más fácil. La publicación del blog que vinculó ahora tiene un código de ejemplo en Python.

En Java, puede usar GradientPaint.

+2

En Java 1.6 o superior, también hay LinearGradientPaint lo que permite un mayor control sobre la forma en que se pinta. Ver http://java.sun.com/javase/6/docs/api/java/awt/LinearGradientPaint.html – Avrom

7

El uso de las clases básicas de AWT, se podría hacer algo como esto:

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

Usted puede utilizar el construido en GradientPaint clase.

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

He estado usando RMagick for that. Si necesita ir más allá del degradado simple, ImageMagick y uno de sus contenedores (como RMagick o JMagick para Java) podrían ser útiles.

+0

Página no disponible ........ – hyprfrcb

1

El seguimiento de la respuesta execllent de David Crow, aquí hay un ejemplo de implementación 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 
    ) 
}