IMAGES (Bilder) Vortrag : Ronny Kuhnert am 9. November 1999 DVG3 - Bilder Abstrakte Klasse Toolkit Die abstrakte Klasse Toolkit definiert die Schnittstelle für Implementierungen des AWT. Methoden der Klasse Toolkit public abstract Image createImage(String filename) – Liefert ein Bild, das aus der durch filename bezeichneten Datei geladen wird. Das geladene Bild wird nicht in einem Cache gehalten. Die Daten werden bei jedem Aufruf erneut gelesen. public abstract Image createImage(URL url) – Bei dieser Variante wird das Bild von der übergebenen URL geladen. public abstract Image createImage(ImageProducer producer) – Erzeugt ein Offscreen-Image, dessen Pixel-Daten von producer bezogen werden. DVG3 - Bilder public abstract Image getImage(String filename) – Liefert ein Bild, das aus der durch filename bezeichneten Datei geladen wird. Hierbei wird das erzeugte Bild in einem Cache gehalten, um künftige Anfragen für dasselbe Bild schneller bedienen zu können. Wenn ein Bild nur einmal benötigt wird, sind die createImage()-Methoden vorzuziehen, die kein Caching betreiben. public abstract Image getImage(URL url) – Bei dieser Variante wird das Bild von der übergebenen URL geladen. public static synchronized Toolkit getDefaultToolkit() – Liefert das standardmäßige grafische Toolkit, mit dem die Komponenten dargestellt werden. Der Standardwert ist durch die Property awt.toolkit festgelegt. DVG3 - Bilder Abstrakte Klasse Graphics Methoden der Klasse Graphics public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer) – Gibt das Bild img an der durch x und y bezeichneten Position aus. observer ist das zu img gehörige Überwachungsobjekt. Für observer wird meist die Komponente übergeben, in der das Bild ausgegeben wird. Der Rückgabewert ist true, wenn das Bild zum Aufrufzeitpunkt bereits vollständig aufbereitet war, sonst false. public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) – Diese Variante erlaubt zusätzlich eine Skalierung des Bildes DVG3 - Bilder import java.awt.*; class Bild1 extends Frame { Image bild= Toolkit.getDefaultToolkit().getImage("BILD.jpg"); public static void main(String[] args) { Bild1 b=new Bild1("Bild"); } Bild1(String title) { super(title); setBounds(50,50,300,300); setVisible(true); } public void paint(Graphics g) { g.drawImage(bild, 10, 10,300,200,this); } DVG3 - Bilder } Klasse MediaTracker Die Klasse MediaTracker dient dazu, den Verarbeitungsstatus von Medien zu überwachen. Als Medien gelten prinzipiell sowohl Bilder als auch Audiosequenzen. Implementiert sind allerdings nur die erforderlichen Methoden für Bilder. Hierbei können mehrere Medien einer bestimmten ID-Nummer zugeordnet werden. Über diese ID kann dann der Status der gesamten Mediensequenz abgefragt werden. Konstruktor der Klasse MediaTracker public MediaTracker(Component comp) – Erzeugt ein neues Exemplar von MediaTracker, das die Bildsequenzen auf der Komponente comp ausgibt DVG3 - Bilder Methoden der Klasse MediaTracker public void addImage(Image image, int id) – Fügt das Bild image zu der Liste der unter der Nummer id überwachten Bilder hinzu. public void waitForAll() – Startet den Ladevorgang für alle registrierten Medien und blockiert, bis er beendet ist. Nach der Rückkehr dieser Methode kann mit isErrorAny() festgestellt werden, ob bei einem Medium ein Fehler aufgetreten ist. Exception: InterruptedException Falls während der Wartezeit eine Unterbrechung durch einen anderen Thread eintritt. public void waitForID(int id) – Startet den Ladevorgang für alle unter der Nummer id registrierten Medien und blockiert, bis er beendet ist. Nach der Rückkehr dieser Methode kann mit isErrorID() festgestellt werden, ob bei einem Medium ein Fehler aufgetreten ist. DVG3 - Bilder public synchronized boolean isErrorID(int id) – Liefert true, wenn mindestens eines der unter der Nummer id registrierten Medien beim Aufbereiten einen Fehler verursacht hat, oder false, wenn alle Medien erfolgreich aufbereitet werden konnten. public synchronized void removeImage(Image image) – Entfernt das Bild image aus der Liste der überwachten Objekte. Falls das Bild unter mehreren IDs registriert ist, wird es überall entfernt. public synchronized void removeImage(Image image, int id) – Entfernt das Bild image aus der Liste der überwachten Objekte für die ID id. Falls das Bild unter mehreren IDs registriert ist, bleiben die weiteren Registrierungen unberührt. DVG3 - Bilder public void mediaTracker() { MediaTracker tracker = new MediaTracker(this); tracker.addImage(bild,1); try { tracker.waitForID(1); } catch (InterruptedException e) { System.err.println("Error: "+e); } } } DVG3 - Bilder Klasse PixelGrabber Mit der Klasse PixelGrabber ist es möglich, einen Ausschnitt eines Bildes zu kopieren. Das Bild muß hierbei in Form eines Image-Objekts vorliegen. Der Ausschnitt wird über seine Breite und Höhe sowie seine linke obere Ecke festgelegt. Über die Parameter offset und scansize der Konstruktoren ist es möglich, durch aufeinanderfolgende Aufrufe von grabPixels() ein Bild aus mehreren Teilbildern zusammenzusetzen oder zu überlagern. offset legt den Startindex fest, ab dem die Pixel im Puffer-Array gespeichert werden, und scansize ist die Pixel-Anzahl, um die die einzelnen Zeilen versetzt im Puffer gespeichert werden. Normalerweise wird scansize auf die Breite des gewünschten Ausschnitts gesetzt. Wenn scansize dagegen größer als die Breite ist, bleiben die überzähligen Spalten im Puffer unverändert. DVG3 - Bilder Konstruktoren public PixelGrabber(Image img, int x, int y, int w, int h, boolean forceRGB) – Erzeugt ein neues PixelGrabber-Objekt, mit dem ein Ausschnitt der Breite w, der Höhe h und der durch x und y festgelegten oberen linken Ecke ausgeschnitten werden kann. Die Bilddaten werden hierbei aus dem Image-Objekt img bezogen. Wenn forceRGB true ist, wird das voreingestellte RGB-Farbmodell zugrunde gelegt. Andernfalls wird das Farbmodell des Bildes übernommen. Methoden public boolean grabPixels() – Versucht, die Pixel zu kopieren, und liefert true, wenn der Versuch erfolgreich war, oder false, wenn ein Fehler aufgetreten oder wenn eine Unterbrechung durch einen anderen Thread eingetreten ist. Diese Methode blockiert so lange, bis entweder der Kopiervorgang beendet oder ein Fehler aufgetreten ist. – Exception: InterruptedException Falls während des Kopiervorgangs eine Unterbrechung durch einen anderen Thread eingetreten ist. DVG3 - Bilder public synchronized boolean grabPixels(long ms) – Zusätzlich zur vorhergehenden Variante kann ein Timeout angegeben werden, in dem der Kopiervorgang abgeschlossen sein muß. Falls der Timeout vorher abläuft, wird auch false zurückgegeben. – Exception: InterruptedException Falls während des Kopiervorgangs eine Unterbrechung durch einen anderen Thread eingetreten ist. public synchronized void imageComplete(int status) – Wird aufgerufen, um den Aufbereitungsstatus des Bildes zu melden. DVG3 - Bilder Klasse MemoryImageSource MemoryImageSource ist ein ImageProducer, der seine Bilddaten aus einem int- oder byte-Array bezieht, das dem Konstruktor übergeben wird. Mit der Methode createImage(), die Component und alle ihre Unterklassen besitzen, können die Bilddaten dann in ein Exemplar von Image gewandelt werden. Seit Version 1.1 werden auch animierte Bilder unterstützt. Konstruktor der Klasse MemoryImageSorce public MemoryImageSource(int w, int h, int[] pix, int off, int scan) – Erzeugt ein neues Exemplar von MemoryImageSource, das aus dem int-Array pix ein Bild der Breite w Pixel und der Höhe h Pixel erzeugt. Die Pixel-Daten werden ab dem Index off ausgelesen, wobei angenommen wird, daß jede Pixel-Zeile in pix um scan Indexpositionen versetzt ist. Per Voreinstellung wird ein RGBFarbmodell verwendet. DVG3 - Bilder Abstrakte Klasse Image Die abstrakte Klasse Image stellt eine allgemeine Schnittstelle für Bilddaten dar. Sie wird plattformabhängig implemeniert. Methoden der Klasse Image public abstract Graphics getGraphics() – Liefert einen grafischen Kontext, in den dieses Bild gezeichnet werden kann. Funktioniert nur bei Offscreen-Images. DVG3 - Bilder public abstract int getHeight(ImageObserver observer) Ermittelt über den übergebenen observer die Höhe des Bildes in Pixeln und liefert sie zurück. Falls der Observer die Höhe bisher noch nicht ermitteln konnte, wird -1 zurückgegeben. public abstract int getWidth(ImageObserver observer) Ermittelt über den übergebenen observer die Breite des Bildes in Pixeln und liefert sie zurück. Falls der Observer die Höhe bisher noch nicht ermitteln konnte, wird -1 zurückgegeben. DVG3 - Bilder import java.awt.*; import java.awt.image.*; class Bild3 extends Frame { Image bild1; Image bild=Toolkit.getDefaultToolkit().getImage("BILD.jpg"); int bwidth; int bheight; int []pix; MemoryImageSource b1; public static void main(String[] args) { Bild3 b=new Bild3("Bild"); } DVG3 - Bilder Bild3(String title) { super(title); setBounds(0,50,650,300); setLayout(new FlowLayout()); mediaTracker(); grab(bild,pix); mis(); Canvas c1=new Canvas() { public void paint(Graphics g) { g.drawImage(bild, 0,0,300,200,this); } }; c1.setBounds(0,0,300,200); add(c1); DVG3 - Bilder Canvas c2=new Canvas() { public void paint(Graphics g) { g.drawImage(bild1, 0, 0,300,200,this); } }; c2.setBounds(0,0,300,200); add(c2); setVisible(true); } public void mediaTracker() { MediaTracker tracker = new MediaTracker(this); tracker.addImage(bild,1); DVG3 - Bilder try { tracker.waitForID(1); } catch (InterruptedException e) { System.err.println("Error: "+e); } bwidth=bild.getWidth(this); bheight=bild.getHeight(this); pix=new int[bwidth*bheight]; } public void grab(Image img, int []pix) { // Kopiert die Bilddaten des übergebenen // Bildes in das übergebene Array PixelGrabber grabber = new PixelGrabber(img, 0, 0, bwidth, bheight, pix, 0, bwidth); DVG3 - Bilder try { grabber.grabPixels(); } catch (InterruptedException e) { e.printStackTrace(); } } public void mis() { b1= new MemoryImageSource(bwidth, bheight, pix,0,bwidth ); bild1=Toolkit.getDefaultToolkit().createImage(b1); } } DVG3 - Bilder Klasse FileDialog Die Klasse FileDialog implementiert einen Dialog, mit dem Dateien ausgewählt werden können. Der FileDialog kennt zwei Modi: LOAD, um Dateien zum Laden zu selektieren, und SAVE, um Dateien zu speichern. Es kann ein Filter für die anzuzeigenden Dateinamen gesetzt werden, so daß nur die Dateien angezeigt werden, deren Name auf den Filter paßt. Der FileDialog ist grundsätzlich modal. Abgeleitet von Dialog->Window->Container->Component Konstruktoren der Klasse FileDialog public FileDialog(Frame parent) – Erzeugt einen neuen FileDialog, um Dateien zu laden. Der Dialog erhält in der Fensterhierarchie den Vorfahr parent und einen leeren Titel. DVG3 - Bilder public FileDialog(Frame parent, String title) – Erzeugt einen neuen FileDialog, um Dateien zu laden. Der Dialog erhält in der Fensterhierarchie den Vorfahr parent und den Titel title. Methoden der Klasse FileDialog public String getDirectory() – Liefert das selektierte Verzeichnis des Dialogs. public String getFile() – Liefert den selektierten Dateinamen nach Beendigung des Dialogs. public FilenameFilter getFilenameFilter() – Liefert den momentanen Dateinamensfilter. public int getMode() – Liefert den Modus des Dialogs (LOAD/SAVE). public synchronized void setDirectory(String dir) – Setzt das Arbeitsverzeichnis des Dialogs auf dir. DVG3 - Bilder public synchronized void setFile(String file) – Setzt die Datei des Dialogs auf file. public synchronized void setFilenameFilter(FilenameFilter filter) – Setzt einen neuen Filter für die Dateinamen. Es werden nur die Dateien angezeigt, deren Name auf der in filter eingetragenen Zeichenkette paßt. filter ist hierbei eine Implementierung des Interface util.FilenameFilter. In dessen Methode accept muß das gewünschte Verhalten implementiert werden. public void setMode(int mode) – Setzt den Modus des Dialogs auf mode. DVG3 - Bilder import java.awt.*; import java.awt.event.*; public class FDialog extends Frame implements ActionListener { FileDialog filedialog; Button open; Label l=new Label("File= "); public static void main(String[] args) { Frame f=new FDialog(); } FDialog() { open=new Button("OPEN"); setLayout(new BorderLayout()); Panel p = new Panel(); p.add(open); p.add(l); DVG3 - Bilder open.addActionListener(this); add(p,BorderLayout.CENTER); setSize(200,100); setVisible(true); } public void actionPerformed(ActionEvent e) { FileDia(); } public void FileDia() { filedialog=new FileDialog(this,"openFile"); filedialog.setDirectory("c:"); filedialog.show(); System.out.println(filedialog.getDirectory()+filedialog.getFile()); l.setText("File="+filedialog.getFile()); } } DVG3 - Bilder