{"id":2234,"date":"2013-09-03T21:06:30","date_gmt":"2013-09-03T19:06:30","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2234"},"modified":"2013-09-03T21:06:30","modified_gmt":"2013-09-03T19:06:30","slug":"bildfilter-mit-awt-imagefilter","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/bildfilter-mit-awt-imagefilter\/","title":{"rendered":"Bildfilter mit AWT-ImageFilter"},"content":{"rendered":"<p>ImageFilter liegen zwischen Produzenten und Konsumenten und ver\u00e4ndern Bildinformationen oder nehmen Einfluss auf die Gr\u00f6\u00dfe. F\u00fcr Bild-Produzenten treten die Filter als Konsumenten auf, die die Schnittstelle ImageConsumer implementieren und die wichtige Methode setPixel() programmieren.<\/p>\n<h4>Grundlegende Eigenschaft von Filtern<\/h4>\n<p>Um einen Filter anzuwenden, nutzen wir die Klasse FilteredImageSource. Im Konstruktor geben wir das Bild und den Filter an. Anschlie\u00dfend k\u00f6nnen wir den zur\u00fcckgegebenen Produzenten an createImage() \u00fcbergeben, und wir haben ein neues Bild.<\/p>\n<p><b>Beispiel:<\/b> Anwendung eines Filters:<\/p>\n<pre>Image src = getImage( &quot;gatesInAlbuquerque.jpg&quot; );\nImageFilter colorfilter = new GrayFilter();\nImageProducer imageprod = new FilteredImageSource( src.getSource(), colorfilter );\nImage img = createImage( imageprod );<\/pre>\n<h4>Konkrete Filterklassen<\/h4>\n<p>Es gibt einige Unterklassen der Klasse ImageFilter, die f\u00fcr unsere Arbeit interessant sind:<\/p>\n<li>BufferedImageFilter. Diesem Filter l\u00e4sst sich ein Objekt vom Typ BufferedImageOp \u00fcbergeben, mit dem unterschiedliche Manipulationen erm\u00f6glicht werden. BufferedImageOp ist eine Schnittstelle, die von AffineTransformOp, ConvolveOp, BandCombineOp und LookupOp implementiert wird. AffineTransformOp ist am attraktivsten, da es mit einem AffineTransform konstruiert wird, sodass leicht Vergr\u00f6\u00dferungen oder Rotationen erm\u00f6glicht werden. \u00dcber AffineTransform-Objekte erfahren wir im 2D-Abschnitt mehr. <\/li>\n<li>CropImageFilter. Bildteile werden herausgeschnitten. <\/li>\n<li>ReplicateScaleFilter. Zum Vergr\u00f6\u00dfern oder Verkleinern von Bildern. Ein einfacher Algorithmus wird angewendet. Eine weiche Vergr\u00f6\u00dferung oder Verkleinerung l\u00e4sst sich mit der Unterklasse AreaAveragingScaleFilter erreichen. <\/li>\n<li>RGBImageFilter. Dieser allgemeine Filter ist f\u00fcr die eigene Filterklasse gedacht. Wir m\u00fcssen lediglich eine filterRGB()-Methode angeben, die die RGB-Bildinformationen f\u00fcr jeden Punkt (x,y) modifiziert. Ben\u00f6tigt der Filter auch die Nachbarpunkte, k\u00f6nnen wir nicht mit RGBImageFilter arbeiten. <\/li>\n<p><b>Beispiel:<\/b> Ein Filter, der den Rot- und Blauanteil in einem Bild vertauscht.<\/p>\n<pre>class RedBlueSwapFilter extends RGBImageFilter\n{\n public RedBlueSwapFilter()\n {\n  canFilterIndexColorModel = true;\n }\n public int filterRGB( int x, int y, int rgb )\n  {\n    return (   (rgb &amp; 0xff00ff00)\n            | ((rgb &amp; 0xff0000) &gt;&gt; 16)\n            | ((rgb &amp; 0xff) &lt;&lt; 16));\n  }\n}<\/pre>\n<h4>Mit CropImageFilter Teile ausschneiden<\/h4>\n<p>Mit CropImageFilter lassen sich Teile des Bilds ausschneiden. Wir definieren daf\u00fcr vom Bild einen Ausschnitt mit den Koordinaten x, y und der Breite und H\u00f6he. Wie die anderen Bildfilter, so wird auch CropImageFilter mit dem FilteredImageSource als Produzent verwendet.<br \/>\n  <br \/>Beispiel Erzeuge f\u00fcr die Grafik big.gif in einem Applet ein neues Image-Objekt. Das Original hat die Gr\u00f6\u00dfe 100 \u00d7 100 Pixel. Das neue Bild soll einen Rand von 10 Pixeln haben.<\/p>\n<pre>Image origImage = getImage( getDocumentBase(), &quot;big.gif&quot; );\nImageFilter cropFilter = new CropImageFilter( 10, 10, 90, 90 );\nImage cropImage = createImage( new FilteredImageSource(origImage.getSource(),cropFilter) );<\/pre>\n<h4>Bildausschnitte \u00fcber PixelGrabber ausschneiden<\/h4>\n<p>Nicht nur \u00fcber CropImageFilter lassen sich Bildausschnitte ausw\u00e4hlen. Eine andere L\u00f6sung geht \u00fcber PixelGrabber, da dieser auch einen Ausschnitt erlaubt. Dar\u00fcber l\u00e4sst sich dann mit MemoryImageSource wieder ein neues Bild erzeugen.<\/p>\n<p><b>Beispiel:<\/b> Schneide aus dem Image img das passende Rechteck mit den Startkoordinaten x, y und der Breite width und der H\u00f6he height aus:<\/p>\n<pre>int[] pix = new int[width * height];\nPixelGrabber pg = new PixelGrabber( img, x, y, width, height,\n                                  pix, 0, width );\ntry {\n  pg.grabPixels();\n}\ncatch( InterruptedException e ) {}\nnewImg = createImage(new MemoryImageSource(width, height, pix, 0, width) );<\/pre>\n<p>An dieser Stelle sollten wir noch einmal den Unterschied zwischen den beiden M\u00f6glichkeiten betonen. PixelGrabber implementiert die Schnittstelle ImageConsumer, sodass er ein Bildkonsument ist und Daten in einem Integer-Feld ablegt. CropImageFilter ist ein Filter, der ein anderes Image-Objekt konstruiert und kein Feld.<\/p>\n<h4>Transparenz<\/h4>\n<p>Um eine bestimmte Farbe eines Bilds durchsichtig zu machen (also die Transparenz zu bestimmen), nutzen wir einen RGBImageFilter. Dabei implementieren wir einen Konstruktor, der die Farbe sichert, die transparent werden soll. Sie wird sp\u00e4ter in der Implementierung von filterRGB() verwendet. Die Methode, die ja f\u00fcr jeden Bildpunkt aufgerufen wird, liefert dann entweder die Farbe ohne Alpha-Kanal zur\u00fcck (rgb|0xff000000) oder eben nur den Alpha-Kanal (rgb &amp; 0xffffff) f\u00fcr Transparenz. Eine interessante Erweiterung ist die Einf\u00fchrung einer Toleranzauswertung um einen \u00bbZauberstab\u00ab, der \u00e4hnlich wie in Photoshop zu realisieren ist.<\/p>\n<pre>import java.awt.*;\nimport java.awt.image.*;\n\npublic class TransparentFilter extends RGBImageFilter\n{\n private final int transparentRGB;\n\n public TransparentFilter( Color color )\n {\n  this.transparentRGB = color.getRGB();\n }\n\n @Override\n public int filterRGB( int x, int y, int rgb )\n {\n  if ( rgb != transparentRGB )\n    return rgb | 0xff000000;\n\n  return rgb &amp; 0xffffff;    \/\/transparent\n }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>ImageFilter liegen zwischen Produzenten und Konsumenten und ver\u00e4ndern Bildinformationen oder nehmen Einfluss auf die Gr\u00f6\u00dfe. F\u00fcr Bild-Produzenten treten die Filter als Konsumenten auf, die die Schnittstelle ImageConsumer implementieren und die wichtige Methode setPixel() programmieren. Grundlegende Eigenschaft von Filtern Um einen Filter anzuwenden, nutzen wir die Klasse FilteredImageSource. Im Konstruktor geben wir das Bild und den [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-2234","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2234"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2234\/revisions"}],"predecessor-version":[{"id":2235,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2234\/revisions\/2235"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}