Hochauflösender Export aus vvvv

Bitte beachten Sie, dass die HTML Version vor allem dazu dient, die indizierbarkeit des Inhals durch Suchmaschinen zu erleichtern. Eine wesentlich lesbarere Version enthält dieses pdf.

 

5| Export von Bild-
.. ausschnitten mit vvvv


Die Vergrößerung von definierten Bildausschnitten ist mit vvvv mit wenigen Knoten zu lösen, wie der Patch in Abbildung 12 zeigt.

Abb.12

Er besteht aus 3 Sektionen: Bildgenerierung, einem Renderer des Gesamtbildes und dem Teil, der einzelne Bildausschnitte vergrößert. Im Bildgenerierungsteil wird ein 3D Modell importiert und transformiert sowie das Gitter gezeichnet, das die Bildaufteilung visualisiert. Dieses Gitter kann mit dem „grid enable“ Button ein- und ausgeblendet werden. Im Mittelteil befindet sich nur ein Renderer (DX9) der die im Bildgenerierungsteil erzeugten Objekte darstellt.
Der rechte Teil vergrößert einen bestimmten Bildausschnitt wofür ein einziger Knoten ausreicht. Mit dem Transform (Transform 2d) Knoten kann über die Pins TranslateX, TranslateY, ScaleX und ScaleY genau der Bildausschnitt des rechten Renderer (DX9) Fensters eingestellt werden.
Dazu muss Transform Out mit dessen View Transform verbunden werden. Die Vergrößerung sollte für X und Y identisch sein, da es sonst Verzerrungen gibt. Es ist nicht verwunderlich, dass der Wert für die Skalierung der Anzahl an Reihen und Spalten („Rows and Columns“) entspricht. Bei einem Drittel des Bildausschnittes ist die Vergrößerung gleich 3 wie der rechte Bildausschnitt im Beispiel (Abb. 12) zeigt.

So kann also der Bildausschnitt eingestellt werden. Jedoch erweist sich diese Methode als sehr mühsam, da die X und Y Position für jeden Bildausschnitt manuell eingestellt werden muss. Eine komfortablere Lösung sollte diesen Nachteil beseitigen.
vvvv besitzt einen Knoten, der eine schnelle Navigation in Gittern erlaubt: GridSplit (2d). Dieser wird auf den Transform (Transform 2d) Knoten aufgesetzt und kontrolliert somit den Bildausschnitt.

Abb.13


Da GridSplit (2d) die Transformationsinformationen für die Skalierung nicht in einem Format liefert, das für die Transformation des Renderer (DX9) Knotens geeignet ist, müssen einige Umrechnungen stattfinden. Dazu dienen die Knoten UniformScale (Transform), Inverse (Transform) und / (Value). Dadurch werden die Unstimmigkeiten korrigiert, was der Aufbau in Abbildung 13 illustriert.
Indem der Wert des Index Pins von GridSplit (2d) verändert wird, kann der Bildausschnitt gewählt werden. Jeder Bildausschnitt hat eine Indexnummer, die sich aus der Position des Ausschnittes errechnen lässt. Die Ausschnitte sind von oben links (Indexnummer = 0) bis unten rechts (Indexnummer = n - 1) sequenziell durchnummeriert. n ist die Anzahl der Bildausschnitte, im vorliegenden Beispiel also
3 x 3 = 9. Soll z.B. der mittlere Bildausschnitt gewählt werden, muss der Index Pin von GridSplit (2d) auf 4 gestellt werden.
Da die Bildausschnitte nun schnell und einfach angesprungen werden können, muss der Patch noch um eine Speicherfunktion erweitert werden um den dargestellten Bildausschnitt auf einen Datenträger speichern zu können. Dazu werden nur zwei weitere Knoten (DX9Texture (EX9.Texture) und Writer (EX9.Texture)) benötigt, wie Abbildung 14 zeigt.

Abb. 14

Wie diese Knoten zu verbinden sind, ist aus dem Patch ersichtlich und wurde zudem bereits in Kapitel 4|1 erklärt. Wichtig ist hier nur, dass der Dateiname auf einen Pfad verweist, der bereits existiert, da der Writer (EX9.Texture) Knoten keine Verzeichnisse erstellen kann. Die Struktur des Dateinamens muss der Form „[Pfad]\[Dateiname]“ entsprechen, wobei beim Speichern die am Writer über den File Format Pin eingestellte Dateiendung angehängt wird. Ein Beispiel: wenn der File Name „C:\temp\vvvv.jpg“ ist und bei File Format „bmp“ eingestellt ist, wird die gespeicherte Datei als „vvvv.jpg.bmp“ im Pfad „C:\temp\“ gespeichert.

Der Patch ist jetzt schon so weit, dass Bildausschnitte gewählt und auf Knopfdruck gespeichert werden können. Allerdings muss der Dateiname für jedes Bild manuell eingegeben werden, was das Exportieren von vielen Einzelteilen sehr mühsam macht. Der nächste Schritt muss also sein, die Auswahl des Bildausschnittes mit dem Dateinamen zu verknüpfen. Ein etwas aufwendigerer Schritt als die vorhergehenden, da dem Patch sieben neue Knoten hinzugefügt werden müssen.
Im Wesentlichen wird dem Patch das Zählwerk Counter (Animation) hinzugefügt, welches durch die Bildausschnitte der Reihe nach durchschalten kann. Zudem kann der Ausgabewert verwendet werden um einen Dateinamen zu erzeugen.
Die Anzahl der Bildausschnitte errechnet sich indem die Anzahl von Reihen und Spalten multipliziert wird, im Beispiel 3 x 3 = 9. Das Zählwerk wird immer um 1 erhöht, wenn dessen Up Pin auf 1 gesetzt wird und springt auf 1 wenn das Maximum (9), also die Gesamtzahl der Bildausschnitte erreicht ist.
Da die Dateinamen mit 001 beginnen sollen, der erste Bildausschnitt jedoch die Indexnummer 0 hat, muss vom Output des Counter (Animation) 1 subtrahiert werden um den korrekten Ausschnitt zu erhalten.

Abb. 15

Die Knoten AsString (Value), Pad (String) und + (String) verwandeln den Output des Zählwerks in einen Dateinamen indem die Indexnummer korrekt formatiert und mit dem statischen Speicherpfad kombiniert wird.

Der FrameDelay (Animation) Knoten hat eine Verzögerungsfunktion, die verhindert, dass der Wert vom Counter (Animation) um 1 erhöht wird bevor das Bild geschrieben wurde. Zuerst wird also gespeichert und dann weitergezählt. Somit können mehrere Teile eines Bildes schnell angesprungen und gleichzeitig gespeichert werden, was den Export von großen Bildern erheblich beschleunigt.



5|1| Konzeption eines Exportmodules

Im vorherigen Kapitel wurde ein Prototyp eines Patches angefertigt, der alle benötigten Funktionen enthält um ein Bild in beliebiger Größe exportieren zu können. Diese Funktionalität soll nun in ein Modul umgewandelt werden, das schnell und einfach mit einem beliebigen Bildgenerierungspatch kombiniert werden kann. Dieses Unterkapitel soll die Frage klären, wie dieses Modul aussehen könnte.
Welche Eingaben wird es von Benutzern und Benutzerinnen erwarten und was soll es zurückliefern.
Dabei wird größter Wert darauf gelegt, dass das Modul so einfach wie möglich bedient werden kann. Das Ziel ist es, das zu entwickelnde Modul zu einem integralen Bestandteil der offiziellen vvvv Distribution zu machen um es allen zugänglich zu machen.

 

5|1|1| Benutzerdefinierte Eingänge

Im Laufe der Entwicklung des Exportmodules wurde klar, dass die Eingangs Pins in zwei Klassen unterteilt werden können: Daten, die vom Bildgenerierungspatch, im Speziellen dem Renderer, geliefert werden müssen und Pins über die der Exportvorgang gesteuert wird.

Um das zu exportierende Bild korrekt an das Exportmodul übergeben zu können, müssen die Renderer (DX9) Knoten gewisse Einstellungen gemeinsam haben. Diese sind:
* render pass: Definiert, in welchen Renderer Fenstern ein Objekt dargestellt wird.
* bg color: Hintergrundfarbe des Renderers.
* depth buffer: Behandlung von Tiefeninformationen. Beeinflusst die Darstellung von
Objekten bei Überlappungen.
* renderer transforms: Alle Transformationen die mit dem View Transform Pin des
Renderer (DX9) im Bildgenerierungspatch verbunden sind.Sind diese nicht identisch,
zeigen das exportierte Bild und der Bildgenerierungspatch nicht den selben Bildausschnitt.

Die anderen Pins bestimmen die anderen Funktionen des Exportmodules. Vor allem die Menge und Art und Größe der zu exportierenden Dateien. Die Pins im Überblick:
* enable: Aktiviert und deaktiviert den Renderer (DX9) im Exportmodul.
* size: Pixelanzahl pro Seite jedes exportierten Einzelbildes.
* rows: Reihen, in die ein Bild eingeteilt wird. Entspricht der Bilderanzahl in einer Reihe.
* cols: Spalte, in die ein Bild eingeteilt wird. Entspricht der Bilderanzahl in einer Spalte.
* GO!: Startet den Exportvorgang und schreibt alle Einzelteile auf einen Datenträger.
* Path: Der Ort auf dem Datenträger, an dem die Files gespeichert werden sollen.
* Filename Prefix: Statischer Teil des Dateinamens. Bei allen exportierten Bildern identisch.
* FileName Padding: Jedes Bild erhält beim Speichern eine eindeutige und fortlaufende Nummer.
Dieser Input Pin definiert die Anzahl an Stellen, die diese Nummer haben muss. 3 bedeutet,
dass eine dreistellige Zahl (z.B. 001 oder 134) an den Dateinamen bzw. Prefix angehängt wird.
* extension: Das Format, in dem die Bilder abgespeichert werden sollen.
Zur Auswahl stehen BMP, JPG, PNG, DDS, DIB, HDR, PFM. Die Art wie die Bilder
weiterbearbeitet werden sollen, bestimmt meistens die Auswahl des Dateityps.

Abb. 16

Nachdem nun geklärt worden ist, welche Eingangspins ein Exportmodul haben sollte, muss geklärt werden, was es zurückliefern soll.

 

5|1|2| Ausgänge

Da das Modul Einzelbilder sequenziell auf einen Datenträger schreibt, kann der Exportprozess einige Zeit in Anspruch nehmen. Deswegen sollten Statusinformationen zur Überwachung des Programmablaufs zurückgeliefert werden. Folgende sinnvolle Ausgangspins konnten identifiziert werden:

Abb. 17

* texture out: Gibt den aktuellen Bildausschnitt als Textur aus. Diese kann in einem
Rendererfenster dargestellt werden und so können bereits während dem Exportvorgang
die Einzelbilder auf Fehler überprüft werden.
* working: Pin steht auf 1 wenn ein Exportvorgang läuft.
* currently saving: Zeigt den Dateinamen (ohne Erweiterung) des momentan
bearbeiteten Bildausschnittes an.
* # images: Liefert die Gesamtanzahl der zu exportierenden Bilder zurück.
* % done: Der fertig gestellte Prozentsatz.

Ein Modul, das die oben definierten Ein- und Ausgangspins besitzt, könnte in jedem Knoten als Modul aufgerufen werden. Abbildung 18 zeigt, wie dieses Modul in einem leeren Patch aussehen würde.
Allerdings sind die Ein- und Ausgänge in diesem Beispiel noch nicht funktionsfähig. Es ist lediglich eine Hülle für den in Kapitel 5 gezeigten Patch um Bildausschnitte zu vergrößern und abzuspeichern.
Aufgabe des nächten Kapitels wird es sein, alle bisherigen Erkenntnisse zur Implementierung eines voll funktionsfähigen und universell einsetzbaren Exportmodules zu nutzen.

 

5|2| Implementierung des Modules

Die im bereits besprochenen Exportpatch (Abb. 15) verwendeten Knoten sind in 3 Kategorien eingeteilt:

 

5|2|1| Bildgenerierung

Die Erzeugung von zu rendernden Objekten. Dieser Abschnitt hat keine Verbindungen mit dem Exportteil und benötigt auch keine. Wenn ein Bild im Renderingteil angezeigt wird, trifft dies auch auf die exportierten Bilder zu. Somit wird dieser Teil nicht im Exportmodul enthalten sein. Deswegen müssen sich später alle Knoten zur Bildgenerierung in dem zu exportierenden Patch befinden. In diesem kann dann der Knoten für den Exporter angelegt werden um ein hochauflösendes Bild zu exportieren.

 

5|2|2| Rendering

Ein Renderer (DX9) und alle daran angeschlossenen Knoten wie Transformationen, Hintergrundfarbe, usw. werden in dieser Kategorie zusammengefasst. Hier werden die Einstellungen des Bildgenerierungsteils in ein Bild umgesetzt. Das zu exportierende Bild muss, bis auf die Größe, mit dem hier dargestellten identisch sein. Gewisse an den Renderer angeschlossenen Knoten (siehe dazu Kapitel 5|2|1) müssen an das Exportmodul angeschlossen werden.

 

5|2|3| Exportteil

Das Exportmodul wird im Wesentlichen aus den hier verwendeten Knoten bestehen, da der Großteil der geforderten Funktionalität bereits implementiert ist. Darum werden alle Knoten aus dieser Kategorie in einen leeren Patch kopiert und mit den in Kapitel 5|1|1 und 5|1|2 definierten Ein- und Ausgängen ausgestattet. Diese können dann mit den entsprechenden Knoten verbunden werden so dass die volle Funktionalität des Exportteiles wiederhergestellt wird. Wird dieser Patch in das „modules“ Verzeichnis von vvvv gespeichert, kann der Exportknoten sofort in jedem beliebigen Bildgenerierungspatch als einfacher Knoten angelegt werden und von dort Einzelteile auf die Festplatte speichern. Allerdings kann das Modul noch nicht selbstständig ein ganzes Bild exportieren und deswegen soll diese Einschränkung im nächsten Kapitel aufgehoben werden.

 

5|2|4| Writer (EX9.Texture Grid)

Abb. 18

Der offizielle Name, den das Exportmodul trägt ist Writer (EX9.Texture Grid). Dieser entspricht den Namenskonventionen für vvvv Module und wurde zusammen mit den Entwicklern festgelegt.
Unter diesem Namen findet sich das Modul auch in der offiziellen Distribution, die es auf der Entwicklerhomepage (vvvv.meso.net) zum kostenlosen Download gibt.

Im Gegensatz zum Patch in Kapitel 5 (Abb. 15) und im Prototyp des Exportmodules aus Kapitel 5|2|3 muss das fertige Modul alle Einzelteile eines Bildes automatisch exportieren können. Dazu muss dem Patch eine Schleife hinzugefügt werden, die den sequenziellen Export aller Bildausschnitte kontrolliert.
In Pseudocode kann der Ablauf eines Exportvorganges so dargestellt werden:
1. Die Gesamtanzahl der Teile berechnen
2. Größe des Bildausschnittes berechnen
3. Bildausschnitt auswählen
4. Filenamen generieren
5. Datei abspeichern
6. Gesamtfortschritt berechnen und Statusinformationen ausgeben
7. Zurück zu 3 bis das Bild in allen Einzelteilen exportiert wurde.

Abb. 19

Abgesehen von 3 Knoten für die Fortschrittsberechnung in Prozent wurden dem Modul nur zwei Knoten hinzugefügt: FrameDelay (Animation) und FlipFlop (Animation). Ersterer verzögert nur die Weitergabe eines Eingangswertes für exakt einen Programmschritt (Frame). Der FlipFlop ist ein logischer Baustein, der seinen Ausgangswert auf 1 stellt, wenn irgend ein Wert außer 0 über den Set Pin in den Knoten
geschickt wird. Der Ausgangswert bleibt so lang auf 1, bis irgend ein Wert außer 0 an den Reset Pin geschickt wird. In diesem Fall springt der FlipFlop wieder zurück und liefert am Ausgang 0. Diese Schritte können beliebig oft wiederholt werden, deswegen der Name.
Wird der Exportvorgang gestartet, schaltet der FlipFlop (Animation) auf 1 und die Speicherung der Einzelteile beginnt. Nach dem Speichern zählt der Counter (Animation) um 1 weiter und der nächste Bildausschnitt wird gespeichert. Der Counter hat jedoch ein definiertes Maximum (die Anzahl der zu exportierenden Bilder) bei dessen Überschreitung er auf den Startwert zurück springt. Dabei wird am Overflow Pin des Counters 1 ausgegeben. Passiert dies, wird noch abgewartet bis das letzte Einzelbild abgespeichert wurde und dann wird an den Reset Pin des FlipFlop (Animation) 1 geschickt. Dieser springt zurück auf 0 und so ist der Exportvorgang beendet.
Dies ist alles, was das Exportmodul können muss um schnell und einfach ein Bild in beliebig vielen Einzelteilen zu exportieren.
Im Anhang befindet sich ein Tutorial, das die Einbindung des Writer (EX9.Texture Grid) dokumentiert und im nächsten Kapitel wird erklärt, wie sich die damit exportierten Bilder wieder zu einem einzelnen, größeren Bild zusammenfügen lassen.

 

<< zurück || weiter >>

0| Einleitung
1| Auflösung von Bilddateien
2| vvvv als Grafikwerkzeug
3| Zeichenbare Objekte in vvvv
4| Bildexport mit vvvv
5| Export von Bildausschnitten mit vvvv
6| Das Zusammensetzen der Teile
7| Conclusio

A| Anhänge

Zurück zur Diplom-Hauptseite

 
 

(c) by Thomas Hitthaler, ampop.net