{"id":3567,"date":"2012-01-02T16:02:16","date_gmt":"2012-01-02T15:02:16","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=3567"},"modified":"2023-05-24T10:15:57","modified_gmt":"2023-05-24T08:15:57","slug":"processing","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2012\/01\/processing.htm","title":{"rendered":"Processing"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2012\/01\/processing.htm#comments'>8 Kommentare.<\/a>)<\/small> <\/div>\n<p>Bei <a href=\"https:\/\/zurueckindieschule.wordpress.com\/2011\/12\/21\/processing\/\">Zur\u00fcck in die Schule<\/a>: gefunden: <a href=\"http:\/\/processing.org\/\">Processing<\/a>, eine Java-Programmierumgebung, mit der man Bilder erzeugen kann. Processing ist eine Lernumgebung und Einf\u00fchrung in das (Java-)Programmieren. Man kann damit einerseits voll objektorientiert schreiben, andererseits kann man genauso gut ohne Objektkrams die vorhanden Methoden benutzen, deren \u00dcberbau wundersch\u00f6n transparent ist.<\/p>\n\n\n\n<p><small>(Fu\u00dfnote: Transparent hei\u00dft \u00fcberall anders soviel wie: &#8222;Durchsichtig, so dass man ins Innere blicken und die Zusammenh\u00e4nge verstehen kann.&#8220; In der Informatik hei\u00dft transparent allerdings: &#8222;Durchsichtig, so dass man hindurchschaut und nichts sieht, also quasi unsichtbar und vor leicht zu verwirrenden Augen verborgen.&#8220;)<\/small><\/p>\n\n\n\n<p>Man kann mit Processing neue Bilder zeichnen oder bestehende Bilder bearbeiten. Das kann man statisch machen oder dynamisch: dann werden daraus bewegte Bilder, entweder automatisch oder durch den Benutzer mit Maus oder Tastatur gesteuert. So kann man auch ganze Simulationen entwerfen, wenn man m\u00f6chte. Man kann sich auch eine Methode schreiben, um die ausgegebenen Bilder zu speichern, die sieht so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void mousePressed() {\n  save(\"bild.jpg\");\n}<\/code><\/pre>\n\n\n\n<p>Viel einfacher geht es wirklich nicht.<\/p>\n\n\n\n<p>Ich wollte aber Filter schreiben, so wie man sie aus Bildbearbeitungsprogrammen kennt. Hier sind ein paar davon. Die Vorgehensweise ist meist die: Man l\u00e4dt erst einmal das Originalbild in den Speicher und legt eine &#8211; noch leere &#8211; Zeichenfl\u00e4che im gleichen Format an. Dann schaut man sich der Reihe nach jeden Pixel des Ursprungsbildes an, merkt sich dessen Farbe (bzw. den Rot-, Gr\u00fcn-, Blauanteil davon), ver\u00e4ndert diese Farbe, und schreibt an dieselbe Position auf der Zeichenfl\u00e4che einen Pixel mit der neuen Farbe.<\/p>\n\n\n\n<p>1. Hier ein einfaches Weichzeichnen, das erste Bild ist das Original:<\/p>\n\n\n\n<div class=\"wp-block-columns is-not-stacked-on-mobile is-layout-flex wp-container-corecolumns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_original.jpg\" alt=\"\" title=\"processing_original\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_blur_3.jpg\" alt=\"\" title=\"processing_blur_3\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_blur_9.jpg\" alt=\"\" title=\"processing_blur_9\"\/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Man \u00e4ndert dabei jede Farbe so, dass man sich von einem Pixel und allen seinen umliegenden Nachbarpixeln (im ersten Beispiel nur die direkt umliegenden, im zweiten auch die in etwas weiterem Abstand) die Durchschnittsfarbe ausrechnet und diese dem Pixel zuweist. Das macht man mit allen Pixeln so und heraus kommt eine Weichzeichnung.<\/p>\n\n\n\n<p>2. Hier eine Gammakorrektur. Die dient zu einer differenzierten Aufhellung oder Abdunklung von Bildern. Dabei wird nicht jeder Pixel im gleichen Ma\u00df heller oder dunkler gemacht, sondern es werden zum Beispiel die dunklen Pixel mehr aufgehellt als die (ja eh schon hellen) helleren. Im ersten Bild mit gamma=0.5, im zweiten gamma = 1.5:<\/p>\n\n\n\n<div class=\"wp-block-columns is-not-stacked-on-mobile is-layout-flex wp-container-corecolumns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_original.jpg\" alt=\"\" title=\"processing_original\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_gamma_0.5.jpg\" alt=\"\" title=\"processing_gamma_0.5\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_gamma_1.5.jpg\" alt=\"\" title=\"processing_gamma_1.5\"\/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Hier sind einem die Nachbarn egal. Man wendet einfach auf den Rot-, Gr\u00fcn-, Blauteil jedes Pixels die \u00fcberraschend einfache Funktion an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>farbeneu = (farbealt\/255)<sup>gamma<\/sup> * 255<\/code><\/pre>\n\n\n\n<p>Die Zahl 255 kommt daher, weil es f\u00fcr jeden Farbton 255 M\u00f6glichkeiten gibt. Der Wert des urspr\u00fcnglichen Blauanteils (von 0-255) wird durch 255 geteilt, womit man diesen Anteil auf eine Zahl zwischen 0 und 1 normalisiert hat. Das wird dann mit dem Gammawert potenziert (bzw. je nach Definition auch dessen Kehrwert) und dann mit dem letzten Faktor wieder auf den urspr\u00fcnglichen Raum (zwischen 0 und 255) gestreckt.<\/p>\n\n\n\n<p>3. Gemischte weitere Filter:<\/p>\n\n\n\n<div class=\"wp-block-columns is-not-stacked-on-mobile is-layout-flex wp-container-corecolumns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_sharpen.jpg\" alt=\"\" title=\"processing_sharpen\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_ellipsen.jpg\" alt=\"\" title=\"processing_ellipsen\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_mosaik_9.jpg\" alt=\"\" title=\"processing_mosaik_9\"\/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Der erste ist ein einfaches Sch\u00e4rfen: Man schaut sich wieder die Rot-, Gr\u00fcn- Blauwerte eines Pixels und seiner Nachbarn an und errechnet daraus wieder einen Durchschnitt. Allerdings werden vor der Berechnung die Nachbarn und der Pixel selber noch gewichtet: die Werte der 8 unmittelbaren Nachbarn werden zum Beispiel jeweils um 1 reduziert, die des zentralen Pixels um 9 erh\u00f6ht &#8211; die Durchschnittswerte bleiben also gleich (das Bild wird insgesamt nicht heller oder dunkler), aber mit Betonung des Zentrums.<\/p>\n\n\n\n<p>Der zweite zeichnet einfach an jede n-te Stelle des Bildes einen Kreis mit Durchmesser n von der Farbe des Pixels, der sich im Originalbild an dieser Stelle befindet.<\/p>\n\n\n\n<p>Der dritte ist ein Mosaik. Man k\u00f6nnte zwar, \u00e4hnlich wie bei den Ellipsen, an jede n-te Stelle des Bildes ein Quadrat zeichnen, aber so wollte ich das nicht machen. Jeder Pixel sollte extra gezeichnet werden. Ich machte mir dazu folgende Skizze:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"128\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_mosaik1.jpg\" alt=\"\" class=\"wp-image-3576\" title=\"processing_mosaik1\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_mosaik1.jpg 550w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_mosaik1-150x34.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/figure>\n\n\n\n<p>Der erste Pixel in der Reihe (in der 0-Spalte) sei zum Beispiel rot. Die beiden Pixel rechts daneben sollten dessen Farbe annehmen. Die Pixel in den Spalten 3-7 sollten die Farbe des Pixels in Spalte 5 annehmen, und so weiter. (F\u00fcr die y-Koordinate analog, das habe ich bald gemerkt.)<br><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3577\" style=\"float: right; margin-left: 10px;\" title=\"processing_mosaik2\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_mosaik2.jpg\" alt=\"\" width=\"58\" height=\"244\"><br>Weil ich in Mathe nicht gut bin, zeichnete ich mir eine Tabelle auf: links die Position des Pixels, rechts die Position des Pixels, dessen Farbe angenommen werden sollte. f(linkeSpalte) = rechteSpalte. Der Rest ist einfach nur Rechnen. Mathek\u00f6nner sehen das durch \u00dcberlegen, ich habe halt so lange herumgepfuscht, bis ich die entsprechende Funktion hatte. Die musste ich dann noch etwas verallgemeinern, damit sie nicht nur f\u00fcr die Rechnung mit den Mosaiksteinchen von Seitenl\u00e4nge 5, sondern f\u00fcr beliebige Seitenl\u00e4ngen gilt. Sieht dann so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>xZentrumspixel = (x+size\/2)\/size*size bzw.\nyZentrumspixel = (y+size\/2)\/size*size,<\/code><\/pre>\n\n\n\n<p>wobei <code>size<\/code> die Seitenl\u00e4nge des Mosaiksteins ist. Und nein, das <code>\/size<\/code> und <code>*size<\/code> kann man nicht einfach k\u00fcrzen, da <code>x<\/code> eine Ganzzahl und die Divison in diesem Fall eine Ganzzahldivision ist &#8211; es wird immer abgerundet, der Rest verworfen.<\/p>\n\n\n\n<p>Processing gibt&#8217;s f\u00fcr alle g\u00e4ngigen Betriebssystem, l\u00e4uft unter Windows auch ohne Installationsrechte. Tutorials gibt es dort auch ein paar.<\/p>\n\n\n\n<p class=\"has-text-align-center\">***<\/p>\n\n\n\n<p>Anhang: So sieht ein vollst\u00e4ndiger <em>Sketch<\/em> in Processing aus. Java-Code, ohne Klassendefinitionen, besteht aus 1 Attribut und den Methoden <code>setup()<\/code> und <code>draw()<\/code> und der Berechnungsmethode f\u00fcr das Mosaik, <code>mosaik()<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PImage img; \/\/Platz fuer das im Speicher gehaltene Bild\n\n\/\/einmaliges Aufrufen am Anfang\nvoid setup() {\n  img = loadImage(\"test.jpg\"); \/\/Laden des Bildes\n  size(img.width, img.height); \/\/Groesse der Zeichenflaeche\n}\n\n\/\/das eigentliche Zeichnen\nvoid draw() {\n  \/\/Pixel-Feld zur Verfuegung stellen\n  loadPixels();\n  \/\/Zaehlschleife fuer alle Pixel mit x- und y-Koordinate\n  for (int x = 0; x &lt; img.width; x++) {\n    for (int y = 0; y &lt; img.height; y++ ) {\n      \/\/Berechnen der neuen Farbe - hier koennte man auch andere Methoden aufrufen\n      color c = mosaik(x, y, 9);\n      \/\/Umrechnen der Koordinaten in Index des eindimensionalen Pixel-Felds\n      int loc = x + y*img.width;\n      \/\/Aendern des Pixels im Pixel-Feld\n      pixels&#91;loc] = c;\n    }\n  }\n  \/\/Zeichnen aller Pixel\n  updatePixels();\n}\n\n\n\/\/Methode zur Farbberechnung beim Mosaik\ncolor mosaik(int x, int y, int groesse) {\n  \/\/Koordinaten des Zentrums ermitteln\n  int xZentrum = (x+groesse\/2)\/groesse*groesse;\n  int yZentrum = (y+groesse\/2)\/groesse*groesse;\n\n  \/\/Umrechnen der Koordinaten in Index des eindimensionalen Pixel-Felds\n  int loc = xZentrum + yZentrum*img.width;\n  \n  \/\/sicher stellen, dass Bildgrenzen nicht ueberschritten werden\n loc = constrain(loc, 0, img.pixels.length-1);\n\n  \/\/Rot-, Gruen-, Blauanteile des Zentrumspixels speichern\n  float rtotal = red(img.pixels&#91;loc]);\n  float gtotal = green(img.pixels&#91;loc]);\n  float btotal = blue(img.pixels&#91;loc]);           \n\n  \/\/ Rueckgabe der neuen Farbe\n  return color(rtotal, gtotal, btotal);\n}\n<\/code><\/pre>\n\n\n\n<p>Nachtrag: Sch\u00f6ne weitere Sachen zu Processing gibt es hier:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sch\u00f6ne Beispiele und viel zum Anschauen und Ausprobieren gibt es auf dieser Begleitseite zu einem Schulbuch: <a href=\"https:\/\/www.ningelgen.eu\/index.html\">https:\/\/www.ningelgen.eu\/index.html<\/a><\/li>\n\n\n\n<li>Ingo Bartling zeigt auf seinem Blog <a href=\"https:\/\/blog.ingo-bartling.de\/category\/informatik\/processing\/\">ganz viel zu Processing<\/a>, hier sogar <a href=\"https:\/\/blog.ingo-bartling.de\/2019\/04\/01\/programmieren-lernen-zwischenstand\/\">als Arbeitsheft<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>(8 Kommentare.) Bei Zur\u00fcck in die Schule: gefunden: Processing, eine Java-Programmierumgebung, mit der man Bilder erzeugen kann. Processing ist eine Lernumgebung und Einf\u00fchrung in das (Java-)Programmieren. Man kann damit einerseits voll objektorientiert schreiben, andererseits kann man genauso gut ohne Objektkrams die vorhanden Methoden benutzen, deren \u00dcberbau wundersch\u00f6n transparent ist. (Fu\u00dfnote: Transparent hei\u00dft \u00fcberall anders soviel [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3568,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25,4],"tags":[227,233],"class_list":["post-3567","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","category-schule-mal-machen","tag-informatik","tag-programmierprojekte"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/processing_blur_3.jpg","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=3567"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3567\/revisions"}],"predecessor-version":[{"id":57548,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3567\/revisions\/57548"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/3568"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=3567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=3567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=3567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}