Eckart Modrow Referenztypen S. 1 Referenztypen Teil 2 Inhalt: 7. Beispiel: Zugriff auf Pixel bei Anwendungen Bezug: G. Krüger, GotoJava 2 HTML-Version: Kapitel 4.2, 4.4, 4.5 Kapitel 11.3
Eckart Modrow Referenztypen S. 2 7. Beispiel: Zugriff auf Pixel bei Anwendungen Wir wollen den schon bekannten BMP-Bildbetrachter noch etwas erweitern. Er soll mit der Fähigkeit ausgestattet werden, geladene Bilder grob zu rastern, ähnlich wie in Filmen, auf denen ein Gesicht unkenntlich gemacht werden soll. vorher nachher Dazu vereinbaren wir einige Größen, Bitmap bmp; boolean bildgeladen = false; int raster = 10; und laden eine Bitmap-Datei: private void menuitem2_click(object source, Event e) ofd.setfilename ("*.bmp"); ofd.setfilter("bmp-dateien (*.bmp) *.bmp"); int result = ofd.showdialog(); if (result == DialogResult.OK ) String filename = ofd.getfilename(); bmp=new Bitmap(fileName); bild.setimage(bmp); bildgeladen = true; ofd ist eine OpenFileDialog-, bild ist eine PictureBox- Komponente Jetzt müssen die Bildwerte verändert werden. Wir bestimmen dazu die mittleren Rot-, Grünund Blauwerte innerhalb eines Quadrats, dessen Seitenlängen durch die (veränderbare) Variable raster gegeben ist. Danach färben wir diesen Bereich mit einer mittleren Farbe ein.
Eckart Modrow Referenztypen S. 3 private void menuitem3_click(object source, Event e) if (bildgeladen) Graphics g = bmp.getgraphics(); Color c; int w = bmp.getsize().x; int h = bmp.getsize().y; int schrittex = (int)math.floor(w/raster); int schrittey = (int)math.floor(h/raster); int R,G,B; int rq = raster*raster; for (int i=0;i<schrittex;i++) for (int j=0;j<schrittey;j++) R = 0; G = 0; B = 0; for (int ii=0;ii<raster;ii++) for (int jj=0;jj<raster;jj++) if (((raster*i+ii)<w) ((raster*j+jj)<h)) c = g.getpixel(raster*i+ii,raster*j+jj); R = R + c.getred(); G = G + c.getgreen(); B = B + c.getblue(); R = Math.round(R/rq); G = Math.round(G/rq); B = Math.round(B/rq); c = new Color(R,G,B); g.setbrush(new Brush(c)); g.setpen(new Pen(c)); g.drawrect(raster*i,raster*j,raster,raster); bild.setimage(bmp); Grafikkontext des Bildes mit allen Rasterwerten tue... und mitteln geändertes Bild anzeigen Bildgröße bestimmen... RGB-Werte der Bildpunkte im Rechteck berechnen...... Zeichenwerkzeuge pen und brush auf die mittlere Farbe einstellen... Rechteck färben private void edit1_textchanged(object source, Event e) String h = edit1.gettext(); char c; int z,r = 0; boolean fertig = false; for(int i=0;i<h.length();i++) c = h.charat(i); z = (int)c-(int)'0'; if ((z<0) (z>9)) fertig = true; if (!fertig) r = 10*r + z; if(r<1) r = 10; raster = r; edit1.settext(string.valueof(raster)); hier wird bei Änderungen im Textfeld versucht, die neu eingegebene Rasterweite zu bestimmen
Eckart Modrow Referenztypen S. 4 Und noch mal, weil es so schön ist!
Aufgaben: Virtuelle Lehrerweiterbildung Informatik in Niedersachsen Eckart Modrow Referenztypen S. 5 1. Führen Sie eine Möglichkeit ein, die Bildpunkte nur in einem z. B. mit der Maus auszuwählenden Bereich zu rastern. 2. Im Beispielprogramm wird das ursprüngliche Bild durch das gerasterte überschrieben. Ändern Sie das Programm so, dass das Ursprungsbild erhalten bleibt. Die Rasterwerte sollen in ein zweidimensionales Feld geschrieben werden, das bei Bedarf in einem anderen Grafikkontext dargestellt wird. Jetzt können Bilder mehrfach gerastert werden. 3. a: Fotografieren Sie mit einer Digitalkamera Gegenstände, die im Bild als Rechtecke erscheinen. (Sie können die Bilder auch von einem Scanner holen.) Speichern Sie die Bilder als Bitmap-Dateien ab. b: Informieren Sie sich z. B. aus Biologiebüchern über Verfahren, mit denen die ersten Neuronenschichten des Auges Kanten und andere Charakteristika (z. B. Bewegungen) erkennen. Grafikprogramme verfügen oft auch über entsprechende Verfahren. c: Wenden Sie ein Kantenverstärkungsverfahren auf Ihre Rechteckbilder an. Lassen Sie die Koordinaten der gefundenen Rechtecke bestimmen und ausgeben. Dürfen sich Rechtecke überlappen? Sind Kanten immer lückenlos? d: Diskutieren Sie Möglichkeiten, Ihre Verfahren in Echtzeit auf bewegte Bilder anzuwenden, z. B. um einen Roboter zu überwachen oder Fahrzeuge auf einer Strasse zu leiten. 4. a: Bestimmen Sie die mittlere Helligkeit eines Bildes. b: Besorgen Sie sich Aufnahmen der gleichen Szene unter verschiedenen Lichtverhältnissen. Versuchen Sie die Bilder so zu bearbeiten, dass die Unterschiede ausgeglichen werden. c: Suchen Sie verschiedene Aufnahmen der gleichen astronomischen Objekte im Internet. Gleichen Sie die Lichtverhältnisse auf den Aufnahmen einander an (bestimmen Sie also den sky ). Ziehen Sie dann die veränderten Bilder von einander ab. (Im Idealfall sollte das Bild jetzt schwarz sein.) Unterschiede in den Aufnahmen treten jetzt stärker hervor, z. B. Objekte, die ihren Ort verändert haben. Auf diese Art kann man Kandidaten für Supernovae bestimmen.