Seminararbeit zum Thema Bildverarbeitung mit Java2D und Java Advanced Imaging von Winkler Bernd Bildverarbeitung mit Java2D und Java Advanced Imaging Inhalt des Vortrags Was ist Java2D Was kann Java2D Wie kann Java2D in einer Applikation einsetzt werden Was ist Java Advanced Imaging Was kann Java Advanced Imaging Wie kann JAI in einer Applikation einsetzten werden Wo lohnt sich der Einsatz welches Frameworks Was leisten beide Frameworks Bildverarbeitung mit Java2D und Java Advanced Imaging Was ist Java2D Java2D Framework für geräte- und auflösungsun-abhängige Grafik und Bilddarstellung Java2D API •zusätzlich zum Anlegen, Verwalten und Manipulieren von Bildern und Grafiken •Ist im JDK API seit der Version 1.2 enthalten. •erweitert die Grafik- und Bildklassen von java.awt und werden vom Abstract Windowing Toolkit (AWT) integriert Bildverarbeitung mit Java2D und Java Advanced Imaging Was ist Java2D Bildverarbeitung mit Java2D und Java Advanced Imaging Was kann Java2D Die Java2D API bietet: Ein einheitliches Rendermodel für anzeigende und druckende Geräte Eine große Anzahl von geometrischen Primitiven, wie Kurven, Rechtecke und Ellipsen, und einen Mechanismus um eine Primitive virtuell zu rendern Mechanismen für die Erkennung von Überlappungen von geometrischen Primitiven, Texten und Bildern Hoch entwickelte, vielseitige Farbunterstützung für erleichtertes Farbmanagement Unterstützung für das Drucken von komplexen Dokumenten Bildverarbeitung mit Java2D und Java Advanced Imaging Was kann Java2D Mit einem Objekt der Klasse Graphics2D des Java2D API‘s lassen sich: Linien jeder Dicke zeichnen Flächen füllen mit Texturen, Gradienten oder Patterns Texte und Grafiken zu drehen, skalieren, scheren und verschieben Aufeinandergezeichnete Texte und Grafiken mischen Die Java2D API erlaubt es auch einfach ein Bild im Speicher zu halten und auf die Pixeldaten auch manipulierend zuzugreifen, um dieses wie im Beispiel zu sehen zu glätten und zu schärfen. Original geglättet geschärft Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann man Java2D in einer Applikation einsetzten Wie bekomme ich ein Objekt von java.awt.Graphics2D? public class MyComponent extends Component { . . . public void paint(Graphics g){ super.paint(g); Graphics2D g2d = (Graphics) g; . . . } } Graphics2D g2d = (Graphics2D) myImage.getGraphics(); Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden Wie nutze ich die geräte- und auflösungsunabhängig Grafik- und Bilddarstellung? GraphicsEnvironment ge = //Grafische Umgebungsvariablen GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gds = ge.getScreenDevices(); //gds = Alle anzeigenden Geräte GraphicsConfiguration[] gcs = gds[x].getConfigurations(); GraphicsConfiguration gc = gcs[y]; //gc = Grafische Konfiguration Y eines Gerätes X AffineTransform aft = new AffineTransform( gc.getDefaultTransform()); //Geräteigene Transformation aft.concatenate(gc.getNormalizingTransform()); /* aft = Umrechnung von 72 Einheiten im Userspace zu 1 Inch im DeviceSpace */ g2d.setTransform(aft); Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden Welche Bildklassen gibt es? java.awt.Image java.awt.image.VolatileImage java.awt.image.RenderedImage java.awt.image.WritableRenderedImage java.awt.image.BufferedImage Welche Operatoren gibt es für Bilder? java.awt.image.AffineTransformOp java.awt.image.ColorConvertOp java.awt.image.ConvolveOp java.awt.image.LookupOp java.awt.image.RescaleOp Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden Wie erhält man ein Objekt der Bildklassen? Image img = java.awt.Toolkit.createImage(path); Image img = new javax.swing.ImageIcon().getImage(path); Applet applet = new Applet(); Image image = applet.getImage(applet.getDocumentBase(),path); BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden Die Klassen, die in dem Java2D API diese Operatoren beschreiben erben alle von der abstrakten Klasse: java.awt.image.BufferedImageOp Die Klasse java.awt.Graphics2D stellt eine Schnittstelle zur Verfügung, um einen solchen BufferedImageOp auf ein BufferedImage anzuwenden. Java2D‘s Konzeptes des virtuellen Renderns wird beispielsweise durch die Methode filter() der Klasse BufferedImageOp repräsentiert. Im nebenstehenden Bild sind die Ergebnisse von einigen Operatoren, die im Graphikkontext auf ein Bild angewendet wurden, zu sehen. Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden Das Model, nachdem sich eine Applikation richtet, wenn sie ihre Operation auf einem Bildobjekte mittels BufferedImageOp.filter(…) ausführt nennt sich: Immediate Mode Kennzeichnendes Prinzip des „Immediate Modes“ ist, Zeichenoperation im dem Moment ihres Aufrufes ausgeführt wird. dass jede Die Java2D API bietet dem Entwickler eine weiter Möglichkeit seine Applikation zu gestallten. Dieses richtet sich nach einem Produzenten – Konsumenten Prinzip, dass sogenannte: Push Model Applikationen dieses Models arbeiten mit einem ImageProducer, der einen ImageConsumer über den Ladefortschritt benachrichtigt und ihm das Ergebnis einer Operation als Ansammlung von Pixel übergibt. Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden ImageProducer +addConsumer( ImageConsumer ic) +isConsumer( ImageConsumer ic) +removeConsumer( ImageConsumer ic) +startProduction( ImageConsumer ic) +requestTopDownLeftRightResend( ImageConsumer ic) ImageConsumer +imageComplete(int status) +setColorModel(ColorModel model) +setDimensions(int width, int height) +setHints(int hintflags) +setPixels(int x, int y, int w, int h, ColorModel model, byte[] pixels, int off, int scansize) +setPixels(int x, int y, int w, int h, ColorModel model, int[] pixels, int off, int scansize) +setProperties(Hashtable props) Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann Java2D in einer Applikation einsetzten werden Durch Objekte der Klasse FilteredImageSource, die von ImageProducer erbt lassen sich Pipelines aus ImageProducern bilden: FilteredImageSource FilteredImageSource ImageProducer FilteredImageSource Applikation ImageConsumer Bildverarbeitung mit Java2D und Java Advanced Imaging Was ist Java Advanced Imaging Java Advanced Imaging erweitert die Java Plattform um die Möglichkeit, hoch entwickelte, performancekritische Bildverarbeitung in Applets und Applikationen anzubieten. Die Java Advanced Imaging API ist ein schnelles, plattformunabhängiges, leicht erweiterbares Bildverarbeitungsframework, das auf den von Java2D geschaffenen Schnittstellen aufsetzt und dadurch zur Java Plattform kompatibel bleibt. Die Java Advanced Imaging API stellt eine Reihe von Objektorientierten Schnittstellen zur Verfügung, die sich nach einem einfach zu programmierbaren Model richten, das es dem Entwickler gestattet, leicht Bilder zu manipulieren. Bildverarbeitung mit Java2D und Java Advanced Imaging Was kann Java Advanced Imaging Welche Funktionalität bietet das Java Advanced Imaging API? • Mehr als 100 Operanden sind in JAI, die meisten nativ, implementiert • JAI erlaubt folgende Bildformate und Datentypen: Byte, UShort, Short, 32-bit Integer, Float/Double in n-bandigen Bildern • JAI liest aus BMP-, GIF-, FPX-, JPEG-, PNG-, PNM-, TIFF-Dateien Bildern • Ausserdem unterstützt JAI RMI (Remote Method Innovation) und IIP (Internet Imaging Protocol). Bilder können über InputStream oder URL geladen werden • JAI bietet Möglichkeiten, Java2D API Grafikdaten in JAI Bilder einzufügen. Bildverarbeitung mit Java2D und Java Advanced Imaging Was kann Java Advanced Imaging Eine Übersicht der Kategorien von Operatoren: Punkt Operatoren Flächen Operatoren Geometrische Operatoren Farbquantisierungs Operatoren Datei Operatoren Frequenz Operatoren Statistische Operatoren Kanten Detektions Operatoren Sonstige Operatoren Bildverarbeitung mit Java2D und Java Advanced Imaging Was kann Java Advanced Imaging Da Java Advanced Imaging auf Java2D aufsetzt, übernimmt es dessen Immediate Mode sowie auch dessen unterstützende Schnittstellen zur Verfügung. Push Model und stellt Seine Performance erhält JAI hauptsächlich, wenn man Klassen aus dem JAI API benutzt, die sich nach dem JAI eigenen Model richten: Pull Model Kennzeichnend für die Bildverarbeitung dieses Modells ist, dass Berechnungen nur dann durchgeführt werden, wenn sie vom Client angefordert werden, also gerade auch benötigt werden. Das Pull Model teilt sich in JAI in zwei Kategorien: Rendereable und Rendered. Als Renderable ist zu verstehen, was noch in Bildkoordinaten verwaltet wird, als Rendered, was sich bereits im User-Space befindet. Beim Zeichnen benutzen die Klassen von Rendereable die von Rendered um das Ergebnis zu produzieren. Diese benutzen wiederum Klassen, die aus JAI‘s Immediate Mode stammen, wie in der Abbildung der nächsten Seite zu sehen. Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann man JAI in einer Applikation einsetzten Die Abbildung zeigt das Prinzip, nachdem das Zeichnen einer Renderable Bildquelle, mit den dabei beteiligten Klassen, geschieht. Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann man JAI in einer Applikation einsetzten Bildquelle RenderableOp RenderedOp Operationsparameter Operationsparameter OpImage Operationsbeschreibung RenderableOp RenderedOp Operationsparameter Operationsparameter RenderableOp RenderedOp OpImage Operationsparameter Operationsparameter Operationsbeschreibung Graphics2D Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann man JAI in einer Applikation einsetzten Durch das Anfügen von Rendered oder Renderable Operatoren zum erzeugen von neuen Operatoren lassen sich Renderbäume bzw. –graphen aufbauen. Werden beispielsweise zwei einfarbige Bilder erzeugt (Bilder aus Konstanten), die dann über einen Additions-Operator verknüpft in einer anzeigenden Komponente sichtbar sind, ergibt sich der folgende Graph daraus: Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann man JAI in einer Applikation einsetzten Ein weiterer Grund für die höhere Performance von Java Advanced Imaging ist die Möglichkeit, die durch RenderedImage definiert wurde, in einem Bild ein Tile – Raster anzulegen und über Produktionsereignisse informiert zu werden. JAI übernimmt die Aufgabe nur diejenigen Tiles zu berechnen, die gerade benötigt werden. Bildverarbeitung mit Java2D und Java Advanced Imaging Wie kann man JAI in einer Applikation einsetzten Wie lade ich ein Bild? RenderedImage ri = JAI.create("fileload",pfad); Wie erhalte ich einen Renderable Operator? RenderableOp raOp = JAI.createRenderable(“renderable”,ri); Wie erzeuge ich eine Operation? ParameterBlock pb = new ParameterBlock(); pb.addSource(ri); // oder raOp; Für Renderable pb.add(0.0f); // X-Koordinate des Drehpunktes pb.add(0.0f); // Y-Koordinate des Drehpunktes pb.add( (float) Math.toRadians( 90 ) ); // Drehwinkel RenderedOp ro = JAI.create(„rotate“,pb); RenderableOp raOp2 = JAI.createRenderable(„rotate“,pb); Bildverarbeitung mit Java2D und Java Advanced Imaging Wo lohnt sich der Einsatz welches Frameworks Java2D unterstützt hauptsächlich graphische Operationen und low-level Bildverarbeitung. Für die meisten Applikationen ist Java2D schnell genug. Vorteile: Braucht keine Zusatzpakete beim Endnutzer Leicht in eine GUI zu integrieren Native Code Implementierungen sind meist einfacher in Java2D zu entwickeln Nachteile: Bietet nur sehr wenige Operationen für Bilder an Entwickler muss sich selbst um ein schnelles Applikationsmodell kümmern Bildverarbeitung mit Java2D und Java Advanced Imaging Wo lohnt sich der Einsatz welches Frameworks Java Advanced Imaging bietet gute Bildverarbeitungsmöglichkeiten, die für komplexere Operationen genauso gut geeignet sind wie für einfachere. Zur reinen Grafikerstellung ist es nicht zu empfehlen. Vorteile: Einfaches durchführen komplexer Operationen auf Bildern Kompatibel zur Java Plattform Hohe Performance Direkte Netzanbindung vorhanden Einfach zu erweitern Nachteile: Zusatzpakete müssen beim Benutzer vorhanden sein Implementierung komplexer als bei Java2D Bildverarbeitung mit Java2D und Java Advanced Imaging Was leisten beide Frameworks Vorführung der Demoprogramme zu Java2D und Java Advanced Imaging Abschließende Fragen