{"id":2551,"date":"2013-12-01T17:10:31","date_gmt":"2013-12-01T15:10:31","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2551"},"modified":"2013-12-01T17:10:31","modified_gmt":"2013-12-01T15:10:31","slug":"inselraus-swingawt-bilder-im-speicher-erzeugen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/12\/inselraus-swingawt-bilder-im-speicher-erzeugen\/","title":{"rendered":"Inselraus: Swing\/AWT-Bilder im Speicher erzeugen"},"content":{"rendered":"<p>Nicht immer kommen die Bilder vom Datensystem oder aus dem Internet. Mit der Java-Bibliothek lassen sich einfach auch eigene (Buffered)Image-Objekte anlegen. Dazu bieten sich \u2013 wieder historisch bedingt \u2013 verschiedene Varianten an:<\/p>\n<ul>\n<li>Jede AWT-Komponente, wie Frame oder Panel, bietet die Methode createImage(\u2026). Die Anweisung Image image = panel.createImage(800, 600); erzeugt ein Image-Objekt mit 800 Pixeln in der Breite und 600 in der H\u00f6he, das mit getGraphics() Zugriff auf den Grafikkontext bietet. Wenn die AWT-Komponente noch nicht angezeigt wurde, liefert createImage(\u2026) die R\u00fcckgabe null, sodass hier leicht eine NullPointerException entstehen kann. Auch unterst\u00fctzen die Bilder keine Transparenz.<\/li>\n<li>Java 1.2 f\u00fchrte die Klasse BufferedImage ein, die eine Erweiterung der Image-Klasse ist. Image ist eine abstrakte Klasse und BufferedImage eine konkrete nicht abstrakte Unterklasse. Ein zentraler Unterschied ist, dass der Zugriff auf die Pixel von BufferedImage-Objekten einfach ist, weil sie auf der Java-Seite in Byte-Arrays gespeichert sind, dass aber der Zugriff auf die Pixel von Image-Objekten schwierig ist, da Image-Objekte vom Betriebssystem kommen. Bei BufferedImage ist die Manipulation der Pixel einfach. Die Klasse bietet drei Konstruktoren. Beim Erzeugen ist immer ein Bildtyp anzugeben, der \u00fcber die physikalische Speicherung bestimmt.<a href=\"file:\/\/\/C:\/Users\/Christian Ullenboom\/Dropbox\/Eigene Dokumente\/Insel\/2\/#_ftn1_3127\" name=\"_ftnref1_3127\">[1]<\/a><\/li>\n<li>createCompatibleImage(\u2026) \u00fcber GraphicsConfiguration erzeugt ein BufferedImage und ben\u00f6tigt keinen Bildtyp.<\/li>\n<\/ul>\n<h6>BufferedImage erzeugen lassen<\/h6>\n<p>Ein Bild \u00fcber createCompatibleImage(\u2026) zu erzeugen, hat den gro\u00dfen Vorteil, dass das Daten- und Farbmodell optimal gew\u00e4hlt ist. Der einzige Nachteil dieser Methode ist die gro\u00dfe Menge an ben\u00f6tigten Hilfsobjekten \u2013 was zus\u00e4tzliche Schreibarbeit bedeutet: <\/p>\n<p>GraphicsConfiguration gfxConf = GraphicsEnvironment.getLocalGraphicsEnvironment().<br \/>&nbsp;&nbsp;&nbsp; getDefaultScreenDevice().getDefaultConfiguration();<br \/>int width = 600, height = 400;<br \/>BufferedImage image = gfxConf.createCompatibleImage( width, height ); <\/p>\n<p>Neben createCompatibleImage(int, int) gibt es auch eine Variante, die die Angabe einer Transparenz erm\u00f6glicht. <\/p>\n<p>abstract class java.awt.GraphicsConfiguration <\/p>\n<ul>\n<li>abstract BufferedImage createCompatibleImage(int width, int height)<br \/>Erzeugt ein BufferedImage.<\/li>\n<li>BufferedImage createCompatibleImage(int width, int height, int transparency)<br \/>Erzeugt ein BufferedImage mit optionaler Transparenz. Das Argument f\u00fcr transparency kann sein: Transparency.OPAQUE (keine Transparenz, der Alpha-Wert ist 1,0), Transparency.BITMASK (Bilddaten sind komplett sichtbar, also opak mit Alpha-Wert 1, oder transparent, also Alpha-Wert 0), Transparency.TRANSLUCENT (Grafik erlaubt das Durchscheinen mit Alpha-Werten von 0,0 bis 1,0).<\/li>\n<\/ul>\n<h6>Das Bild bemalen<\/h6>\n<\/p>\n<p>Image-Objekte (BufferedImage ist eine Unterklasse) geben \u00fcber getGraphics() das Graphics-Objekt zur\u00fcck, mit dem sich das Bild bemalen l\u00e4sst. Im Fall eines speziellen BufferedImage-Objekts ist es jedoch \u00fcblich, die Methode createGraphics() einzusetzen, da sie ein Graphics2D-Objekt \u2013 eine Unterklasse von Graphics \u2013 liefert, mit dem weitere Zeichenoperationen m\u00f6glich sind. Au\u00dferdem ruft getGraphics() sowieso createGraphics() auf &#8230; <\/p>\n<p>Beispiel: Initialisiere ein Bild img mit wei\u00df. <\/p>\n<p>Graphics2D g = img.createGraphics();<br \/>g.setColor( Color.WHITE );<br \/>g.fillRect( 0, 0, b \u2013 1, h \u2013 1 ); <\/p>\n<p>Alternativ kann zum L\u00f6schen des Hintergrunds auch g.setBackground(Color.WHITE); g.clearRect(\u2026); verwendet werden. <\/p>\n<h6>BufferedImage von Hand erzeugen<\/h6>\n<\/p>\n<p>Der Konstruktor der Klasse BufferedImage wird mit den Ma\u00dfen parametrisiert und zus\u00e4tzlich mit einem Speichermodell f\u00fcr die Bildinformationen. Das erm\u00f6glicht die Verwendung von beliebigen Farb- und Speichermodellen: <\/p>\n<p>int h = 400,<br \/>&nbsp;&nbsp;&nbsp; b = 600;<br \/>BufferedImage img = new BufferedImage( b, h, BufferedImage.TYPE_INT_RGB ); <\/p>\n<p>Das notwendige dritte Argument kennzeichnet den Speichertyp; hier sind die Farben durch je 8 Bit Rot, Gr\u00fcn und Blau abgebildet. Um weitere 2 der \u00fcber 10 Bildtypen zu nennen: TYPE_USHORT_GRAY (Graubilder) oder TYPE_INT_ARGB (RGB mit jeweils 8 Bit sowie Alpha). <\/p>\n<p>class java.awt.image.BufferedImage<br \/>extends Image<br \/>implements RenderedImage, Transparency, WritableRenderedImage <\/p>\n<ul>\n<li>BufferedImage(int width, int height, int imageType)<br \/>Liefert ein neues Hintergrundbild mit den gegebenen Ma\u00dfen.<\/li>\n<\/ul>\n<hr align=\"left\" size=\"1\" width=\"33%\"\/>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian Ullenboom\/Dropbox\/Eigene Dokumente\/Insel\/2\/#_ftnref1_3127\" name=\"_ftn1_3127\">[1]<\/a> Details finden Sie unter http:\/\/weblogs.java.net\/blog\/chet\/archive\/2004\/08\/toolkitbuffered.html.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nicht immer kommen die Bilder vom Datensystem oder aus dem Internet. Mit der Java-Bibliothek lassen sich einfach auch eigene (Buffered)Image-Objekte anlegen. Dazu bieten sich \u2013 wieder historisch bedingt \u2013 verschiedene Varianten an: Jede AWT-Komponente, wie Frame oder Panel, bietet die Methode createImage(\u2026). Die Anweisung Image image = panel.createImage(800, 600); erzeugt ein Image-Objekt mit 800 Pixeln [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-2551","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2551"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2551\/revisions"}],"predecessor-version":[{"id":2552,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2551\/revisions\/2552"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}