DarkWizzard
Mitglied
Hallo,
ich habe ein kleines Problem mit SWT Images.
Undzwar gibt es da ja drei Möglichkeiten, mit Transparenz zu arbeiten:
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
ich habe ein kleines Problem mit SWT Images.
Undzwar gibt es da ja drei Möglichkeiten, mit Transparenz zu arbeiten:
- Globale Transparenz für ein Bild
- Eine Farbe als tranparent markieren
- 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