SWT Images: Transparenz

DarkWizzard

Mitglied
Hallo,

ich habe ein kleines Problem mit SWT Images.
Undzwar gibt es da ja drei Möglichkeiten, mit Transparenz zu arbeiten:

  1. Globale Transparenz für ein Bild
  2. Eine Farbe als tranparent markieren
  3. Array mit Alphawerten für jeden einzelnen Pixel

Wenn man sowas wie ein Bildbearbeitungsprogramm basteln will taugen die ersten beiden Möglichkeiten natürlich nicht viel, da will ich für jeden pixel den Alpha-Kanal kontrollieren können.

Jetzt klappt das leider nicht, wenn ich dem ImageData des Bildes einfach nen neuen Array zuweise, ich muss aus dem ImageData ein neues Bild erstellen, das hat dann die neuen Alpha-Werte drin.

Zu allem Überfluss muss ich die noch "per Hand" setzen, ich find jedenfalls keine Funktionen oder Klassen dafür. Das bedeutet, wenn ich da auf eine bisher transparente Fläche einen Kreis male, muss ich mir selbst ausrechnen, welche Pixel zu diesem Kreis gehören, die Alpha-Werte dieser Pixel neu berechnen und setzen, dann die ImageData von dem Bild holen und daraus ein neues Bild erstellen.


Schon das mit dem ausrechnen welche Pixel dazu gehören ist Mist. Das hab ich schon an ner anderen Stelle mit ner tollen Formel gemacht die fast die gleichen Pixel raus bekommt wie der Grafik-Kontext (GC) mit dem ich den Kreis male. Aber eben nur fast und das Resultat ist bescheiden.

Hintergrund zu letzterem war, dass ich Freihandlinien natürlich von einem Punkt zum nächsten male, bei jedem MouseEvent. Wenn ich aber teilweise transparent (z.B. Alpha = 150) male kommt nur mist bei raus, weil die Punkte die mir das MouseEvent gibt natürlich doppelt gemalt werden.

Ich hab mir dann die Kreisförmige Region berechnet die nicht ein zweites Mal übermalt werden sollte und hab es über Clipping versucht. Das Ergebnis war alles andere als zufriedenstellend weil die Berechnung des Kreises eben nicht absolut das gleiche raus bekommen hat wie die des GC. Deshalb blieb immer ein Sichelförmiger Rand der doppelt gemalt wurde.

Zweiter Ansatz war das mit einem Path zu machen, aber erstens kann ich da bei einem mal Maus hin und her ziehen auch wirklich nur eine "Schicht" Farbe aufbringen, mehrfach über eine Stelle bringt nichts; und zweitens wurde das unerträglich lahm wenn der Pfad zu lang wurde.

Ist das wirklich so aufwendig oder hab ich da was übersehen?

Danke im Vorraus,
DarkWizzard
 
Irgendwie scheine ich ja ein Händchen für Fragen zu haben die keiner beantworten kann oder will :(


Edit:

Das zweite Problem war ja, dass solche "Freihandlinien" an den Punkten des MouseEvents immer doppelt gezeichnet wurden. Dafür hab ich jetzt ne einfache Lösung gefunden:

Ich habe ein zweites Layer, das über das eigentliche Bild gemalt wird (drüber malen, nicht in das Image direkt). In diesem Layer male ich mit voller Opazität (also alpha=255) mit der gewünschten Farbe. Der Rest des Bildes ist durchsichtig, was ich einfach darüber realisiert habe dass ich vorher eine Farbe bestimmt habe die nicht die ist, mit der ich male, diese als transparente Farbe im Bild gespeichert habe (image.getImageData().transparentPixel = int-Wert der Farbe) und alles damit eingefärbt habe.
Danach muss ich nur noch beim mouseUp-Event dieses zweite Layer mit der gewünschten Transparenz in das eigentliche Bild malen.
 
Zuletzt bearbeitet:
Zurück