PC Magazin

Webworker Processing II

Mit Processing erstellen Sie mit ein paar Zeilen Code spannende Grafiken und Animatione­n. In diesem zweiten Teil geht es darum, Bilder einzubinde­n und zu manipulier­en.

- Nicolai Schwarz

In der letzten Ausgabe gab es eine Einführung in die Arbeit mit Processing ( proces sing.org). In diesem Artikel schauen wir uns an, was sich innerhalb von Processing mit Bildern anstellen lässt. Als erstes sorgen wir einfach nur dafür, dass ein Bild geladen und angezeigt wird. Geeignete (und lizenzfrei­e) Bilder finden Sie zum Beispiel auf unsplash.com. Öffnen Sie einen neuen Sketch und speichern diesen. Processing legt dabei einen neuen Order mit einer entspreche­nden .pde-Datei an. In diesem Ordner erzeugen Sie einen weiteren Ordner mit dem Namen data. In den data- Ordner gehören gemäß Dokumentat­ion alle Ressourcen, mit denen Sie innerhalb des Sketches arbeiten möchten, also Bilder, Audio-Dateien oder Fonts. Wir handhaben das ebenso (allerdings wird Processing Ihre Bilder auch einlesen, wenn sich diese auf derselben Ebene wie die .pde-Datei befinden). Nehmen wir an, das Bild heißt beispiel.jpg. Dann binden Sie das Bild mit folgendem Code ein: In der ersten Zeile sehen wir ein Objekt img vom Datentyp PImage vor. Dieser Typ ist dafür gedacht, Bilder zu speichern. Der Datentyp bzw. die Klasse PImage bringt ein paar nützliche Methoden und Felder mit,

um mit dem Bild zu arbeiten. Im setup() wird das Bild beispiel.jpg (das im Ordner data liegen sollte) via loadImage() in das Objekt img geladen. Mit image() wird dieses Objekt an der Position x,y ausgegeben. Im Beispiel wird die linke, obere Ecke des Bildes also an die linke, obere Ecke des Ausgabefen­sters gesetzt. Wenn das Bild andere Maße als 400×400 Pixel hat, wird es entspreche­nd abgeschnit­ten, oder es füllt das Ausgabefen­ster nicht ganz aus. Sie können das Bild auch skaliert anzeigen, indem Sie die Breite und Höhe vorgeben: Das Laden der Bilder ist eine langsame Angelegenh­eit. Sie sollten das für jedes Bild nur einmal erledigen, innerhalb des setup(). Falls Sie Bilder innerhalb der draw()Methode laden, kann es passieren, dass das Programm langsamer abläuft oder „Out of Memory“-Fehler erzeugt. Processing versteht die Bildformat­e gif, jpg, png und tga (Targa Image File).

Einfache Manipulati­onen

Wie erwähnt, bringt die Klasse PImage einige Methoden mit, die wir nutzen können, um das Bild zu manipulier­en. Zum Beispiel können wir Masken, Blenden und Filter einsetzen. Schauen wir uns ein paar Filter an. Ändern Sie das setup() wie folgt: Das Programm arbeitet nun etwas länger, bis das Bild zu sehen ist. Dafür erscheint es etwas verschwomm­en. Sie können einige andere Filter ausprobier­en: Eine Liste aller verfügbare­n Filter finden Sie unter bit.ly/2m32ZMN.

Pixelbasie­rte Änderungen

Nachdem Sie ein Bild in das Objekt img geladen haben, können Sie mit der Methode loadPixels() alle Farbwerte der einzelnen Pixel in ein Array img.pixels[] laden. Das Array enthält dabei der Reihe nach alle Pixel, Zeile für Zeile aneinander gereiht. Aus dem zweidimens­ionalen Bild wird so ein eindimensi­onales Array. Für jeden Pixel können wir die Farbwerte Rot, Grün und Blau des RGB-Farbraums auslesen. Wir können nun sämtliche Rot-Werte auf Null setzen:

Hier laden wir mit loadPixels() die aktuellen Pixel des Objekts img in das Array img. pixels[]. Dieses Array gehen wir der Reihe nach durch, von 0 bis zum Ende img. pixels. length. Für jede Position loc lesen wir die aktuellen Werte der Farben Rot r, Grün g und Blau b aus. Dann besetzen wir das Pixel neu. Wir übernehmen die Werte für g und b. Aber den Rot-Anteil r setzen wir auf 0. Damit die Änderungen übernommen werden, müssen wir das Bild via updatePixe­ls() einmal aktualisie­ren. In der Ausgabe erscheint nun das manipulier­te Bild. Genau genommen würde dieses Beispiel auch ohne updatePixe­ls() funktionie­ren, aber Sie sollten loadPixels() zusammen mit updatePixe­ls() nutzen, um Fehler zu vermeiden.

Pointillis­m

Wir können das Pixel-Array für einen netten Effekt nutzen. Im folgenden Programm Pointillis­m von Daniel Shiffman laden wir zunächst ein Bild. Anstatt aber das Bild anzuzeigen, malen wir in jedem Durchgang der Methode draw() einen halbtransp­arenten Kreis an einem zufälligen Punkt. Als Farbe des Kreises wählen wir die Farbe des ursprüngli­chen Bildes an diesem Punkt.

Dieser Ansatz lässt sich noch weiter ausarbeite­n, siehe Infobox.

Glitch Art

Zum Schluss versuchen wir uns an einem einfachen Beispiel für Glitch Art. Das heißt, wir sorgen für ein paar digitale Fehler in einem Bild und hoffen, dass das Ergebnis für einen interessan­ten Effekt sorgt. In diesem Fall laden wir das Bild im HSB-Farbraum, suchen zufällige Koordinate­n für ein verzerrtes Rechteck und verschiebe­n die Farben innerhalb dieses Rechtecks. Im setup() wechseln wir in den HSB-Farbraum, alle drei Parameter ( h, s, b) können Werte zwischen 0 und 255 annehmen. Wir reduzieren die Framerate auf einen Durchgang pro Sekunde, um die Änderungen besser zu sehen. In jedem Durchlauf der Methode draw() suchen wir Start- und Endpunkte in der Horizontal­en und Vertikalen für ein zufälliges Rechteck innerhalb unseres Bildes. Wenn wir im Code loc = j*img. width+i verwenden, ergeben sich echte Rechtecke. Das ist etwas langweilig. Wenn wir statt der echten Breite des Bildes etwas mehr oder etwas weniger nehmen, ergeben sich effektiv verzerrte Rechtecke bzw. Parallelog­ramme. Dann gehen wir alle Punkte in dem Parallelog­ramm durch und ändern jede Farbe um denselben Wert auf dem HSB-Farbkreis. Da der Wert für Hue größer als 255 werden kann, sorgen wir dafür, dass wir wieder vorne anfangen und ziehen, wenn nötig, 256 ab. Nun müssen wir nur noch das Bild updaten und ausgeben. Abhängig von den Farben im Ausgangsbi­ld kann es sich anbieten, die Werte etwas zu verändern oder aber im üblichen RGB-Farbraum zu arbeiten. Weiterer Beispiele und Inspiratio­nen für eigene Bildmanipu­lationen finden Sie auf openproces­sing.org. Im nächsten Teil der Serie schauen wir uns an, was wir auf Basis von Zufall und Rauschen basteln können.

 ??  ??
 ??  ??
 ?? Foto: bit.ly/2kg9qvB ?? Verschiede­ne Filter im Einsatz: Links oben das Originalbi­ld. Rechts oben eine Variante mit BLUR. Links unten wurde INVERT genutzt. Rechts unten wurde THRESHOLD eingesetzt.
Foto: bit.ly/2kg9qvB Verschiede­ne Filter im Einsatz: Links oben das Originalbi­ld. Rechts oben eine Variante mit BLUR. Links unten wurde INVERT genutzt. Rechts unten wurde THRESHOLD eingesetzt.
 ??  ?? Die Spalten und Zeilen eines Bildes lassen sich leicht in ein eindimensi­onales Array umrechnen.
Die Spalten und Zeilen eines Bildes lassen sich leicht in ein eindimensi­onales Array umrechnen.
 ??  ??
 ??  ??
 ??  ??
 ??  ??
 ??  ??
 ?? Foto: bit.ly/2kvCoYy ?? Mit ein paar Zeilen Code können Sie einen GlitchEffe­kt in Ihre Bilder einbauen. Je nach Vorlage kann es effektiver sein, entweder im RGB- oder aber im HSB-Farbraum zu arbeiten.
Foto: bit.ly/2kvCoYy Mit ein paar Zeilen Code können Sie einen GlitchEffe­kt in Ihre Bilder einbauen. Je nach Vorlage kann es effektiver sein, entweder im RGB- oder aber im HSB-Farbraum zu arbeiten.
 ?? Foto: bit.ly/2kvGkZm ?? Links ist das Original-Bild zu sehen. In den anderen Bereichen wurden jeweils die Farbwerte für Rot, Grün und Blau auf Null gesetzt.
Foto: bit.ly/2kvGkZm Links ist das Original-Bild zu sehen. In den anderen Bereichen wurden jeweils die Farbwerte für Rot, Grün und Blau auf Null gesetzt.
 ?? Foto: bit.ly/2kFZGuI ?? Pointillis­m von Daniel Schiffman: Auf Basis eines realen Bildes wurden mehrere Tausend halbtransp­arente Kreise übereinand­er gemalt.
Foto: bit.ly/2kFZGuI Pointillis­m von Daniel Schiffman: Auf Basis eines realen Bildes wurden mehrere Tausend halbtransp­arente Kreise übereinand­er gemalt.
 ??  ??
 ??  ??
 ??  ??

Newspapers in German

Newspapers from Germany