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
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
.
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);
}
}
}
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);
}
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.
Página no disponible ........ – hyprfrcb
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
)
}
- 1. Generando programáticamente htpasswd
- 2. gradientes de CSS horizontal?
- 3. Gradientes CSS3 como SVG
- 4. Generando HTML programáticamente en C#, Targeting Printed Reports
- 5. gradientes radiales CSS3 con RGBA()
- 6. gradientes de color Con ggplot
- 7. Manejo de gradientes CSS de Internet Explorer
- 8. gradientes de fondo en IE7 con CSS
- 9. Imagen de gradientes CSS3 en transparente
- 10. generando licenses.licx
- 11. Generando singletons
- 12. Generando URI en Jena para RDF
- 13. ¿Cómo agregar múltiples gradientes de CSS como un fondo múltiple?
- 14. ¿Debo usar los gradientes SVG generados por Colorzilla para IE9?
- 15. gradientes de reflexión usando CSS en el navegador Android
- 16. CSS: Gradientes simples en Internet Explorer <= 8
- 17. ¿Agregar imágenes cuando se usan gradientes de CSS?
- 18. usando UIScrollView generando problemas
- 19. Generando límite multiparte
- 20. generando documentos docx dinámicos
- 21. Generando una cadena aleatoria
- 22. Generando pruebas unitarias automáticamente
- 23. Generando documentación de Javascript
- 24. Generando una ruta canónica
- 25. HTTP: Generando encabezado ETag
- 26. Generando imágenes moderadamente interesantes
- 27. Generando código F #
- 28. Generando mapas dinámicamente
- 29. Generando vectores en MATLAB
- 30. Generando .dll usando CMake
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