2009-08-03 7 views
3

ich ein Grafiksystem für Java haben, die mehrere Bilder durch Angabe Objekte werden „tapeziert“ ermöglicht es, die (relativ) -Komplex Ausrichtung und Größe ändern Optionen zugewiesen werden.mehrere Bilder zu einem einzigen Bild für eine spätere Malerei Kombinieren, mit Alpha-Blending-

Um eine angemessene Leistung zu erzielen (besonders bei Geräten mit sehr geringer Leistungsaufnahme), mache ich das Bild beim ersten Malen auf ein internes Bild und kopiere dieses zusammengesetzte Bild dann in den Zielgrafikkontext, um es zu erhalten der Bildschirm. Die Zusammensetzung wird dann nur neu erstellt, wenn das Objekt in der Größe geändert wird, so dass die einzige Arbeit für nachfolgende Repaints darin besteht, die abgeschnittene Region vom zusammengesetzten in den Zielgrafikkontext zu kopieren.

Die Lösung funktioniert wirklich gut, außer dass, wenn ich PNG-Bilder mit Alphakanal-Transparenz habe, der Alphakanal beim Malen der Zusammensetzung verloren geht - das heißt, die Zusammensetzung hat alle Pixel vollständig undurchsichtig. Die nachfolgende Kopie in den Onscreen-Grafikkontext lässt also nicht zu, dass das hinter dem tapezierten Objekt durchscheint.

Ich habe es geschafft, eine RGBImageFilter zu verwenden vollständig transparente Pixel, um herauszufiltern, aber ich kann keine Lösung damit zu machen blended Transparenz der Arbeit.

Kennt jemand eine Möglichkeit, um die Bilder mit dem alpha-Kanal intakt malen kann, und in Kombination, wenn zwei Pixel mit Alpha-Werten überlappen?

Antwort

3

Welche Art von Bild verwenden Sie für das zusammengesetzte Bild?

sollten Sie einen BufferedImage verwenden und setzen Sie ihn auf TYPE_INT_ARGB ist Art, die Transluzenz ermöglicht.

+0

Ich habe gerade java.awt.component.createImage werden(). Wird sich mit einem BufferedImage beschäftigen und Sie wissen lassen, wie es läuft. –

+0

Das funktioniert, vielen Dank. Wie ich BufferedImage vermisst habe, weiß ich nicht! –

+2

BufferedImage ist meiner Meinung nach die nützlichste Bildunterklasse Java. Sie sollten das immer verwenden, wenn Sie können. Wenn dieses Image häufig verwendet wird, sollten Sie die Hardwarebeschleunigung aktivieren, indem Sie BufferedImage(). SetAcceleration() mit einem Parameter größer als 0 aufrufen. Weitere Informationen finden Sie in der API. –

Verwandte Themen