# Bild einfärben



## FloOo (1. Feb 2010)

Hallo Leute,
ich bin gerade dabei einen kleinen "Partikel Emitter" zu machen und möchte gerne, dass sich die Farbe des Partikels, also des Sprites, über die Zeit ändern kann. Das Standartbild ist einfach nur ein weißer transparenter Verlauf, den ich gerne einfach nur in einer Farbe meiner Wahl einfärben will. Die Transparenz soll dabei aber erhalten bleiben. 
Hier mal ein Bild wie ich mir das so gedacht habe^^






(mit Photoshop ist das halt einfacher)

Ich weis leider nicht wie ich das mathematisch und programmiertechnisch umsetzen kann -.-
Hoffe es kann mir jemand helfen .. das wär echt nett =)


----------



## Marco13 (1. Feb 2010)

Wie liegen denn die Daten bisher vor? Wenn man davon ausgeht, dass man alle "betroffenen" Pixel in irgendeiner Weise in ein "Color"-Objekt packen kann, kann man auf Basis dessen eine Color erstellen, die man (am einfachsten) über das HSB-Farbmodell (genagenommen den Hue-Wert) entsprechend einfärbt. Wenn es effizient sein soll, sollte man sich aber evtl. was anderes überlegen....


----------



## FloOo (1. Feb 2010)

also das Weiße ist ein PNG-Bild .. da möchte ich praktisch einen Filter rüberlaufen lassen, der mir das Bild zb rot einfärbt.
Ich weis nur nicht wie die mathmatische Funktion dafür ist ein Bild einzufärben und wie man Bilder mit Java Filtert.
Effizienz ist auch noch so eine Sache, aber ich habe mir das so gedacht:
Ich erstelle erst alle Bilder mit den verschiedenen Farben und speichere die in einer Animation und muss dann nur noch das Bild auswechseln anstatt jedes mal das Bild neu einzufärben 
ma sehen ob das klappt, wenn ich erstmal schlauer bin =)


----------



## Marco13 (1. Feb 2010)

Ja nee  in java gibt's kein PNG. Ich nehme an, du hast dann irgendwann ein BufferedImage. Ganz grob könnte man das Einfärben dann so machen (halb-Pseudocode)

```
for (int x=0; x<bi.getWidth(); x++)
{
    for (int y=0; y<bi.getHeight(); y++)
    {
        int rgbIn = bi.getRGB(x,y);
        Color cIn = new Color(rgbIn);
        int r = cIn.getRed();
        int g = cIn.getGreen();
        int b = cIn.getBlue();
        float hsb[] = Color.RGBtoHSB(r,g,b,null);
        hsb[0] = ... // Ein Hue für die gewünschte Farbe
        hsb[1] = ... // Saturation ggf. anpassen
        hsb[2] = ... // Brightness ggf. anpassen
        Color c = Color.getHSBColor(hsb[0], hsb[1], hsb[2]);
        r = c.getRed();
        g = c.getGreen();
        b = c.getBlue();
        Color cOut = new Color(r,g,b,cIn.getAlpha());
        int rgbOut = cOut.getRGB();
        bi.setRGB(x,y,rbgOut);
    }
}
```
Ist aber grottigst inenffizient und kompliziert, wenn man die "Rahmenbedingungen" genauer kennte (und mehr zeit inverstierte), könnte man da was schöneres machen....


----------



## FloOo (1. Feb 2010)

hmm ja so ungefähr dachte ich mir das^^
ich nehme jetzt aber die variante, bei der man selbst die bilder erstellen muss und diese dann später in einer animation umgewandelt werden .. das ist am einfachsten .. trotzdem danke


----------



## Marco13 (1. Feb 2010)

Es ginge auch kompakter und eleganter mit einer ColorConvertOp, aber da hätt' ich den Code nicht aus dem Kopf hinschreiben können


----------

