Was ist Java Advanced Imaging

Werbung
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
Herunterladen