Frage

Bei 2 RGB-Farben und einer rechteckigen Fläche möchte ich einen grundlegenden linearen Farbverlauf zwischen den Farben erzeugen.Ich habe eine schnelle Suche durchgeführt und das Einzige, was ich finden konnte, ist dieser Blogeintrag, aber der Beispielcode scheint zu fehlen, oder zumindest zum Zeitpunkt dieses Beitrags.Alles hilft, Algorithmen, Codebeispiele, was auch immer.Dies wird in Java geschrieben, aber die Anzeigeebene ist bereits erledigt. Ich muss nur noch herausfinden, was angezeigt werden soll.

War es hilfreich?

Lösung

Sie möchten eine Interpolation zwischen der ersten und der zweiten Farbe.Die Interpolation von Farben ist einfach, indem für jede ihrer Komponenten (R, G, B) die gleiche Interpolation berechnet wird.Es gibt viele Möglichkeiten zur Interpolation.Am einfachsten ist es, die lineare Interpolation zu verwenden:Nimm einfach den Prozentsatz P der ersten Farbe und Prozentsatz 1 - P des zweiten:

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

Es gibt eine andere Frage damit zusammenhängend.

Es gibt andere Interpolationsmethoden, die manchmal besser funktionieren.Zum Beispiel mit a glockenförmig (sigmoidal) Die Interpolationsfunktion macht den Übergang glatter.

/BEARBEITEN:Hoppla, Sie meinen die Verwendung einer vordefinierten Funktion.Okay, noch einfacher.Der Blog-Beitrag, den Sie jetzt verlinkt haben, enthält einen Beispielcode in Python.

In Java könnten Sie das verwenden GradientPaint.

Andere Tipps

Sie können das eingebaute verwenden Farbverlaufsfarbe Klasse.

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

Mit den grundlegenden AWT-Klassen könnten Sie etwa Folgendes tun:

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

Im Anschluss an die hervorragende Antwort von David Crow finden Sie hier eine Kotlin-Beispielimplementierung

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

Ich habe verwendet RMagick dafür.Wenn Sie über den einfachen Farbverlauf hinausgehen müssen, können ImageMagick und einer seiner Wrapper (wie RMagick oder JMagick für Java) könnte nützlich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top