Images. Kommen auf zweierlei Weise zur Anwendung. Darstellung von Pixelbildern(.jpg,.gif,.png) Bilden die Grundlage für Offscreendrawing

Ähnliche Dokumente
Java - AWT Basispraktikum SystemArchitektur WS 2008/ Atanas Dimitrov

Zeichnen und animieren

Applets Belebung von Webseiten. Dipl.-Ing. Wolfgang Beer

Programmieren II. Zeichnen in Swing-Komponenten. Heusch 18 Ratz Institut für Angewandte Informatik

Bitmaps und Animationen

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Graphische Benutzungsoberflächen

Klassen in Java. Klassen

Klausur zur Informatik A WS 2001/2002 Name: Korrektor: Punkte: a) Zeichnen Sie zu der nachstehenden Syntax in EBNF die passenden Syntaxdiagramme.

Grafikausgabe mit dem Abstract- Windowing-Toolkit. Eine Einführung

Objektorientierte Programmierung OOP Objektorientierte Programmierung (OOP) mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Java Kurzreferenz Für Fortgeschrittene

Einstieg in die Informatik mit Java

GUI Programmierung mit JAVA Swing

Aufgabe 1: Objekte, Klassen, Vererbung (15 Punkte)

Java. Prof. Dr. Stefan Enderle NTA Isny

Appletprogrammierung

Klausur: Java (Liste P)

Gegeben ist ein Path-Objekt mit folgender Beschreibung des Hauses vom Nikolaus:

NTB Druckdatum:

Programmieren in Java

Programmieren 2 Selbststudium Semesterwoche 4

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Probeklausur: Programmierung WS04/05

7.5 Mit bunten Kreisen spielen

Universität Paderborn Prof. Dr. Stefan Böttcher. Kapitel 3: Java Applets

Objektorientierte Software-Entwicklung

Lesen Sie zuerst die Hinweise auf der Rückseite!

Plotten von Kreisen ( nach Jack Bresenham ) (C) Ac bis

Grafik-Programmierung

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik GUI-Programmierung mit Swing

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Interaktive Elemente, GUI-Programmierung

Fenster in Java. von Stefanie Gerckens 1

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Variablen manipulieren per JDI

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Kapitel 4: Klassen und Unterklassen

Kapitel 6. Vererbung

Grundlagen der Programmierung APPLETS

Ein Manager mit CardLayout layout/cards.java

Kapitel 6. Vererbung

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

24. Textausgabe in Java. Vorgetragen von Rüdiger Heidenreich

Applets. Applets. Applets. Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung von einem Java-fähigen Web-Browser oder sog.

Musterlösung Stand: 5. Februar 2009

Einstieg in die Informatik mit Java

Java Beans. von Raoul Schneider

Probeklausur: Programmierung WS04/05

Schritt 1 - Ein Spielfeld

Lösung zu Praktikum 1 -Programmierung eines Java Card Applets-

Graphische Programmierung: GUIs: graphical user interfaces

Objektorientierte Programmierung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Klausur vom 14. Juni Informatik 4

Java Beans.

Ab jetzt: Java ohne Kara

JAVA - Methoden

Einführung in die Programmierung

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Programmieren 2 Java Überblick

Vererbung. Was versteht man unter dem Begriff Vererbung?

Vererbung. Martin Wirsing. Ziele. Vererbung

Klausur Fachprüfung Wirtschaftsinformatik. Name:

public class SternchenRechteckGefuellt {

Java Einführung Methoden in Klassen

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Kurs: Programmieren in Java

JAVA für Nichtinformatiker - Probeklausur -

Session 1: Classes and Applets

Java - Programmierung - Objektorientierte Programmierung 1

Universität Karlsruhe (TH)

Kapitel 6. Vererbung

von Anja Austermann Drag and Drop

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

class BahnTest2 { public static void main(string[] args) { Zug myice = new Zug("ICE Duisburg", 1200, 0, 50); BahnCardFahrer kunde2 = new BahnCardFahre

Einführung in die Informatik - Teil 6b -

Ziel dieses Kapitels: Einführung in die Grundzüge der Programmierung graphischer Benutzeroberflächen (engl.: "graphical user interface", GUI) in Java

Java Einführung Abstrakte Klassen und Interfaces

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

25 Object Serialization

Udo Matthias Munz. Datenbanken und SQL. mit. Einführung. Informationstechnik

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Algorithmen und Datenstrukturen

Gebundene Typparameter

Subnetting Version 0 Munz FTE1- JAVA Programm Analyse

3 Objektorientierte Konzepte in Java

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

II.3.1 Rekursive Algorithmen - 1 -

Java - Programmierung - Applets 1

1 Abstrakte Klassen, finale Klassen und Interfaces

Einstieg in die Informatik mit Java

Drucken soll nur das Panel, nicht der ganze Rahmen gedruckt werden.

Applet Firewall und Freigabe der Objekte

Dokumentation des Projektes Tic Tac Toe

Grafikprogrammierung mit Java Teil 1/2

4 Codierung nach Viginere (Lösung)

Transkript:

Graphics Klasse, die alle grundlegenden Methoden zum Zeichnen und Schreiben bereitstellt (draw -Methoden, Methoden zu Fonts und Colors) Bereitstellung eines Graphics-Objektes durch das AWT bei Aufruf der paint() Methode durch ImageObject.getGraphics() durch create() kann eine Kopie eines Graphics Object erzeugt werden durch visiblecomponent.getgraphics() 1

Images Kommen auf zweierlei Weise zur Anwendung Darstellung von Pixelbildern(.jpg,.gif,.png) Bilden die Grundlage für Offscreendrawing Images sind keine Komponenten wie Buttons oder Labels. Images werden über Methoden der Klasse Graphics auf die Oberfläche einer Component ausgegeben. Die einfachste Methode ist folgende: public abstract boolean drawimage(image img, int x, int y, ImageObserver observer) 2

ImageObserver ist dabei die Component auf der das Bild erscheinen soll (this). Das Laden eines Bildes erfolgt über die Methode Img=getToolkit().getImage(FileName); Img=getToolkit().getImage(Url); Für Applets: this.getimage(url); Das Laden der Pixel erfolgt asynchron nachdem die Methode getimage längst verlassen worden ist. Der ImageObserver lädt die Pixel, wenn das Bild erstmalig angezeigt werden soll, die Applikation wird aller 100 ms benachrichtigt um die inzwischen nachgeladenen Pixel anzuzeigen. 3

paint-methode Jede Component oder von ihr abgeleitete Klasse enthält eine Methode paint. public void paint(graphics g) Um ein Bild auszugeben, wird eine Klasse von Component oder Panel abgeleitet und die Methode paint überschrieben. In der überschriebenen Methode paint können nun draw-funktionen aufgerufen werden, um Bilder auszugeben oder zu zeichnen. Der Aufruf der Methode paint erfolgt von der virtuellen Maschine automatisch. 4

import java.awt.*; import java.awt.event.*; public class ImgPanel extends Panel private Image Img; ImgPanel(Image Img) this.img=img; public void paint(graphics g) g.drawimage(img,0,0,this); public static void main(string args[]) Frame F=new Frame("ImagepanelDemo"); Image I=F.getToolkit().getImage(args[0]); ImgPanel P=new ImgPanel(I); F.add(P); F.addWindowListener(new WindowAdapter()...); F.pack(); F.setVisible(true); 5

Größe der abgeleiteten Component Soll sich eine selbst programmierte Component bezüglich Ihrer Größe gegenüber dem Layoutmanager genauso verhalten, wie Standardkomponenten, muss die Methode public Dimension getpreferredsize() überschrieben werden. Die Methode getpreferredsize wird beim Aufbau der Oberfläche automatisch aufgerufen, um die Größe einer Component zu ermitteln. Die zurückzugebende Dimension kann aus der Größe des Bildes berechnet werden, wenn es fertig geladen ist. 6

public Dimension getpreferredsize() return new Dimension(Img.getWidth(this),Img.getHeight(this)); Genau hier liegt der Hund begraben! Das Image wird erst geladen, wenn es denn wirklich dargestellt werden soll, also während des Aufrufes der paint-methode. Einziger Ausweg besteht darin, das Bild vor der Ausgabe über drawimage in der paint-methode zu laden. Das gezielte Laden eines Images kann mit einem Objekt der Klasse MediaTracker erfolgen 7

MediaTracker Erlaubt das Laden von Bildern bevor sie Verwendung finden. Verhindert so die stückweise Ausgabe von Bildern. Ermöglicht die Bestimmung der Größe von Bildern vor ihrer Verwendung private Image Img; ImgPanelMT(Image Img) // Constructor this.img=img; MediaTracker M=new MediaTracker(this); M.addImage(Img,1); try M.waitForID(1);catch (Exception e) 8

Mit der Methode addimage können dem Mediatracker Aufträge zum Laden von Bildern übertragen werden. Das Laden der Bilder erfolgt nun asynchron Mit waitforid kann nun gewartet werden, bis ein bestimmtes Bild geladen worden ist. Mit waitforall kann gewartet werden, bis alle Bilder geladen worden sind. Die Anzeige des Bildes erfolgt dann ich gleicher Weise in der Methode paint, wie im ersten Beispiel. 9

Filter Filter ermöglichen die Berechnung eines neuen Bildes aus den Pixeln eines vorhandenen Bildes. Es gibt vorgefertigte Filter, wie den CropImageFilter zum Ausschneiden. Filter mit zu überschreibenden Filterfunktionen, wie den RGBImageFilter 10

Vorgehen Erzeugen einer Instanz des Filters Erzeugen einer FilteredImageSource Erzeugen des neuen Bildes CropImageFilter F=new CropImageFilter(x,y,width,height); FilteredImageSource S= new FilteredImageSource(Img.getSource(),F); Img=createImage(S); Oder: Img=createImage(new FilteredImageSource( Img.getSource(), new CropImageFilter(x,y,width,height))); 11

RGBImageFilter //.../JDK1.5/docs/api/java/awt/image/RGBImageFilter.html class RedBlueSwapFilter extends RGBImageFilter public RedBlueSwapFilter() True: Filterung positionsunabhängig False: Filterung von der Position abhängig // The filter's operation does not depend on the // pixel's location, so IndexColorModels can be // filtered directly. canfilterindexcolormodel = true; public int filterrgb(int x, int y, int rgb) return ((rgb & 0xff00ff00) ((rgb & 0xff0000) >> 16) ((rgb & 0xff) << 16)); Ein Pixel=4Byte 0x xx000000 Alpha 0x 00xx0000 Red 0x 0000xx00 Green 0x 000000xx Blue 12

Das Pixel aa rr gg bb Ein Pixel 32 Bit FF FF 00 00 Rot FF 00 FF 00 Grün FF 00 00 FF Blau 4 Byte aa=0x00 transparent aa=0xff undurchsichtig Warum gibt es keine Klasse Pixel mit get- und set- Funktionen? Der Zugriff auf die Farbwerte jedes Pixels wäre wohl zu langsam. Die Filterfunktion wird für jedes Pixel des Bildes aufgerufen. Laufzeiteffizienz ist hier in hohem Maße gefragt. 13

Aufbau der Filterfunktion int filterrgb(int x, inty, int rgb) int a, r, g, b; a=(rgb & 0xff000000) >>> 24;//oder //a=(rgb & 0xff000000) /0x1000000; r=(rgb & 0x00ff0000) >>> 16;//oder //r=(rgb & 0x00ff0000) /0x10000; g=(rgb & 0x0000ff00) >>> 8;//oder //g=(rgb & 0x0000ff00) /0x100; b=(rgb & 0x000000ff); // jetzt kann mit den Farbwerten // oder dem Alphakanal gerechnet werden // zuletzt neues Pixel zusammenbauen: return a * 0x1000000 // oder a<<24 + r * 0x10000 // oder r<<16 + g * 0x100 // oder g<< 8 +b; Ein Rechenbeispiel, bei dem der Rotanteil verändert werden soll zeigt, warum die einzelnen Farbteile nach rechts geschoben werden müssen: rgb=0xff220000 & 0x00FF0000 -------------- 0x00220000 + 0x00FF0000 -------------- 0x01210000 / 2 -------------- 0x00908000 Übergriff auf Grün! Falschfarben sind Folge 14

Ein einfacher disable -Filter class DisableFilter extends RGBImageFilter DisableFilter() System.out.println("new DisableFilter"); public int filterrgb(int x, int y, int rgb) int a,r,g,b; a = rgb & 0xff000000; r = ((((rgb & 0xff0000)>>>16)+0xff)/2)<<16; g = ((((rgb & 0x00ff00)>>> 8)+0xff)/2)<< 8; b = (((rgb & 0x0000ff) +0xff)/2) ; return a r g b; 15

Berechnung eines gefilterten Randes Constructor mit Argument ist notwendig, um die Breite des Randes in eine Instanzvariable zu übernehmen canfilterindexcolormodel = false; um positionsabhängig zu filtern. Filterfunktion muss nun die Pixelposition x und y auswerten und davon abhängig filtern. Um einen gleitenden Rand zu berechnen, kann der Alphakanal berechnet, oder anteilig Pixelund Hintergrundfarbe verrechnet werden. 16

class RedBorder extends RGBImageFilter int a,w,h,b; public RedBorder(int w, int h, int b) canfilterindexcolormodel = false; this.w=w; this.h=h; this.b=b; public int filterrgb(int x, int y, int rgb) if (x<b ) return 0xffff0000;//rgb a 0xff0000; if (y<b ) return 0xffff0000;//rgb a 0xff0000; if ((w-x)<b) return 0xffff0000;//rgb a 0xff0000; if ((h-y)<b) return 0xffff0000;//rgb a 0xff0000; return rgb; 17

Skalieren von Bildern Bilder werden in ihrer Originalauflösung ausgegeben Ist das Bild zu groß, wird nur ein Bildausschnitt sichtbar. Zwei Möglichkeiten ein Bild zu skalieren: Skaliertes Bild als Objekt erzeugen Bild bei der Ausgabe via drawimage skalieren 18

Erzeugen skaliertes Image public ImgComponent(Image I) Img=I.getScaledInstance(1440, 1050, Image.SCALE_SMOOTH); MediaTracker M=new MediaTracker(this); M.addImage(this.Img,1); try M.waitForID(1);catch (Exception e) Skalieren durch drawimage public void paint(graphics g) g.drawimage(img,0,0,1440, 1050,this); 19