Gerando gradientes programaticamente?

Dadas 2 colors rgb e uma área retangular, eu gostaria de gerar um gradiente linear básico entre as colors. Fiz uma pesquisa rápida e a única coisa que consegui encontrar é essa input de blog , mas o código de exemplo parece estar faltando, ou pelo menos foi a partir desta postagem. Qualquer coisa ajuda, algoritmos, exemplos de código, seja o que for. Isso será escrito em Java, mas a camada de exibição já está cuidada, eu só preciso descobrir como descobrir o que exibir.

você quer uma interpolação entre a primeira e a segunda cor. A interpolação de colors é fácil calculando a mesma interpolação para cada um de seus componentes (R, G, B). Existem muitas maneiras de interpolar. O mais fácil é usar a interpolação linear: basta pegar a porcentagem p da primeira cor e a porcentagem 1 – p da segunda:

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

Há outra questão relacionada a isso.

Existem outros methods de interpolação que às vezes funcionam melhor. Por exemplo, usar uma function de interpolação em forma de sino (sigmoidal) torna a transição mais suave.

/ EDIT: Opa, você quer dizer usando uma function predefinida. OK, ainda mais fácil. A postagem do blog que você vinculou agora tem um código de exemplo no Python.

Em Java, você poderia usar o GradientPaint .

Você pode usar a class GradientPaint integrada.

 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); } 

Usando as classs básicas do AWT, você poderia fazer algo assim:

 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); } } } 

Na sequência da resposta execllent de David Crow, aqui está uma implementação de exemplo 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 ) } 

Eu tenho usado o RMagick para isso . Se você precisar ir mais longe, o gradiente simples, o ImageMagick e um de seus wrappers (como RMagick ou JMagick for Java) podem ser úteis.