Extern 4 - Woche 13
Aufgaben
L1: Pointillism
LösungErweitere das Beispiel, so dass die Fläche schneller mit Kreisen gefüllt wird. Zeichne dafür pro Durchlauf einfach mehrere Kreise. Ändere den Code weiterhin so, dass die Größe der Kreise interaktiv gesteuert werden können.
Variante: Verwende andere visuelle Elemente. Lass einige Parameter zufällig bestimmen.
Variante: Errechne einen Mittelwert der Farben.
L2: LiveVideo-Pointillism
LösungKombiniere das LiveVideo-Beispiel mit deinem Sketch J2, so dass du das Kamerabild direkt manipulierst.
L3: RasterizedVideo
Verwende die unten stehende Funktion drawRectImage()
um das LiveVideo Bild zu rastern.

Variante: Probiere verschiedene Varianten aus. Farben manipulieren, interaktiv werden lassen, etc.
Bildbearbeitung
In diesem Abschnitt werden wichtige Bildbearbeitungsthemen erläutert, die für die Videobearbeitung ebenso notwendig sind. (Siehe auch nochmal PImage-Objekt)
Bildgröße
Nachdem mit loadImage()
ein Bild in ein PImage
geladen wurde, kann die Größe des Bildes abgefragt werden.
Dazu können die Eigenschaften width
und height
verwendet werden.
Pixelarray
Ein Bild besteht aus den einzelnen Bildpunkten, die auf einer Fläche angeordnet sind. Auf die einzelnen Farbwerte des Zeichenbereichs
kann – wie wir letztes Semester gesehen hatten – über die Anweisung get(x, y)
zugegriffen werden. Wie man
nun die Pixel eines Bildes auslesen und verwenden kann, ohne das Bild zeichnen zu müssen, wird im Folgenden gezeigt.

Die einzelnen Bildpunkte eines PImage
-Bildes sind in einem Pixelarray gespeichert. In Processing kann man auf die Pixel via
img.pixels[i]
zugreifen. In diesem Array sind die Farbwerte jedes Bildpunktes allerdings einfach, d.h. linear hintereinander abgelegt.

So kann durch den Index bspw. nicht direkt auf das Pixel in der 3. Zeile, 2. Spalte zugegriffen werden (hier: j).
Um nun auf das zweidimensionale Bild in gewohnter Weise zugreifen zu können, kann man folgende Formel verwenden:
pixelIndex = y * bildBreite + x
Möchte man nun auf den Pixel vom obigen Beispiel zugreifen, also folgendermaßen (wobei natürlich immer bei 0 zu zählen begonnen wird):
Beispiel: Pointillism
Zur besseren Veranschaulichung dieses Pixelarrays hier ein Beispiel, dass ein Bild nicht direkt zeichnet, sondern an zufällige Positionen Kreise zeichnet, die von einem an dieser Stelle liegenden Farbwert beeinflusst werden.



Je mehr und je feinere Kreise gezeichnet werden, desto besser kann das Original-Bild erkannt werden.
In setup()
werden die üblichen Einstellungsanweisungen ausgeführt, und das Bild geladen.
In drawPoint()
wird zunächst (in Zeilen 17, 18) eine zufällige Position auf dem
Bild ausgewählt und in integer-Variablen gespeichert. Danach wird der Farbwert des Pixels (über die obengenannte Formel)
an dieser Position ausgelesen und ein Kreis in dieser Farbe gezeichnet.
Video 2
Pixel-Array der Zeichenfläche
Um schneller und performanter arbeiten zu können, können statt mit Zeichenanweisungen auch direkt die Farben des sichtbaren Felds manipuliert werden.
So können einzelne Pixel über das Array pixels[]
verändert werden, anstatt mit point(x, y)
.
Das Pixel-Array enthält für alle Pixel des Zeichenbereichs die Werte (vom Datentyp color
).
Das Array ist genauso groß wie die Zeichenfläche: Wenn der Sketch mit size(200, 100)
erstellt wurde, ist das Array folglich 200×100 groß
und enthält daher 20.000 Werte. Der Index bestimmt die Position innerhalb des Arrays. (Siehe Pixel-Array der Bilder)
Bevor mit dem Array gearbeitet werden kann, müssen die aktuellen Werte, d.h. die aktuell zu sehenden Farben auf der Zeichenfläche, mittels loadPixels()
geladen werden. Nachdem man die Daten geändert hat, muss updatePixels()
aufgerufen werden, um die Änderungen auch sichtbar zu machen.
- Processing Reference: pixels[]
- Processing Learning: PixelArray
- Processing Reference: loadPixels()
- Processing Reference: updatePixels()
Pixelmanipulation
Zum leichteren Start hier eine Funktion, die ein PixelArray verwendet, um es aus Rechtecken zu zeichnen. Die Parameter sind:
- pixelArray - Das PixelArray
- w - Weite des Ausschnitts
- w - Höhe des Ausschnitts
- wd - Weite der Rasterung
- hd - Höhe der Rasterung
Möchte man zum Beispiel das Live-Bild mit dieser Methode zeichnen, kann folgender Aufruf genutzt werden: