12.9 | Verwendung von Filtern |
Durch die Verwendung von Filtern kann man in Java komplexe Bildbearbeitung betreiben. Ein Filter schaltet sich zwischen ImageProducer und ImageConsumer. Er empfängt die Bilddaten, die der ImageProducer liefert, verändert sie nach bestimmten Regeln und gibt sie anschließend an den ImageConsumer weiter.Die Klasse ImageFilter ist abstrakt, d. h., man kann nicht direkt ein Exemplar erzeugen, sondern man muss zuerst eine eigene Klasse ableiten. Durch die Implementierung der Methoden werden einem ImageFilter bestimmte Eigenschaften zugeordnet.
Im Paket java.awt.image sind bereits drei ImageFilter definiert, die direkt vom Programmierer verwendet werden können:Die Benutzung eines ImageFilters erfordert eine bestimmte Art von ImageProducer namens FilteredImageSource. FilteredImageSource ist nach MemoryImageSource der zweite ImageProducer, von dem Exemplare erzeugt werden können.
- CropImageFilter
Ermöglicht es dem Benutzer, einen bestimmten Bereich eines Bildes auszuschneiden.- ReplicateScaleFilter
Ermöglicht das Skalieren von Bildern durch einen sehr einfachen Algorithmus. Beim Vergrößern von Bildern werden Zeilen oder Spalten verdoppelt, beim Verkleinern werden Zeilen oder Spalten ausgelassen.- AreaAveragingScaleFilter
Ermöglicht das Skalieren von Bildern. Hierfür wird ein Algorithmus benutzt, der zur Berechnung Bereichsmittelwerte verwendet. Dadurch wird ein wesentlich glatteres Ergebnisbild erzielt als mit ReplicateScaleFilter, allerdings auf Kosten eines höheren Rechenaufwands.
Dem Konstruktor von FilteredImageSource müssen zwei Parameter übergeben werden:Das endgültige Bild wird wie bei MemoryImageSource mit createImage() erzeugt, wobei das Exemplar von FilteredImageSource als Parameter übergeben wird.
- Der ImageProducer des Bildes, das gefiltert werden soll
- Ein Exemplar des ImageFilters, der die Filterung vornehmen soll
In folgendem Code-Auszug wird die Filterung eines Bildes mit dem AreaAveragingScaleFilter vorgenommen:Image img = getImage(getCodeBase(), "bild.gif"); Image scaledImg = new FilteredImageSource(img.getSource(), new AreaAveragingFilter(100,100));Über die Methode getSource() der Klasse Image wird der ImageProducer des zu filternden Bildes abgefragt. Der AreaAveragingFilter filtert das ursprüngliche Bild auf Breite und Höhe 100.