Codelab Hilfe Teil 1 - Einführung

CodeLab ist ein Paint.NET-"Effekt", mit dem man Code schreiben können, der im laufenden Betrieb kompiliert und dann in der Paint.NET-Effekt-Engine bezogen auf die aktuelle Auswahl ausgeführt wird. Mit CodeLab kann man fast alle Arten von Effekten implementieren, wenn man über das nötige Programmiertalent und das mathematische Hintergrundwissen verfügt. Dieses Plugin stellt einen Code-Editor zur Verfügung, in den man C#-Code eingeben kann, der dann kompiliert und ausgeführt (gerendert) wird, sobald man aufhört zu tippen. Wenn man dem Effekt zufrieden ist, kann man ihn als DLL-Datei speichern und ihn mit anderen Nutzern teilen.

Im einfachsten Fall, d. h. wenn der ausgewählte Effekt keine Benutzeroberfläche (UI) hat, werden bei der Auswahl eines Effekts aus dem Paint.NET-Menü zwei grundlegende Dinge ausgeführt:

  1. Die aktuelle Auswahl wird in Rechtecke ausgewählter Pixel aufgeteilt, und
  2. die Render()-Funktion des Effekts wird für jedes dieser Rechtecke einmal aufgerufen.

Lassen Sie uns diese beiden Dinge nacheinander untersuchen:

ROI - Rectangle of Interest

Wenn Paint.NET bereit ist, einen Effekt aufzurufen, wird die aktuelle Auswahl in praktische Arbeitseinheiten (eigentlich Rechtecke) unterteilt. Wir nennen diese Rechtecke Rectangles of Interest (ROI). So könnte Paint.NET eine kreisförmige Auswahl in ROI aufteilen:

Hier Beispielbild

Jede Farbe steht für ein anderes ROI. Sie können eine oder mehrere Zeilen hoch und eine oder mehrere Spalten breit sein. Sie können unterschiedlich groß sein. Die einzige Garantie ist, dass die ROI rechteckig ist und alle Pixel in jeder ROI Teil der aktuellen Auswahl sind (wie durch die marschierenden Ameisen gezeigt).

Render()-Funktion

Der Grund, warum Paint.NET die Auswahl in ROI aufteilt und die Funktion Render() mit jeder einzelnen ROI aufruft, ist die Effizienz. Jeder Aufruf von Render() wird in einem eigenen Thread ausgeführt. Wenn Ihre CPU also über mehrere Kerne verfügt, nutzt Paint.NET dies aus, indem es alle Kerne verwendet, um den Effekt so schnell wie möglich abzuschließen.

Wenn das alles sehr kompliziert und überwältigend klingt, machen Sie sich keine Sorgen - Sie müssen den Code, der das Multi-Threading möglich macht, nicht schreiben. Dieser Teil wird für Sie erledigt. Um einen Effekt zu erstellen, müssen Sie lediglich die Funktion Render() selbst schreiben... und wir haben eine Vorlage, die Ihnen den Einstieg erleichtert!

Werfen wir einen Blick auf eine sehr einfache Render()-Funktion:

Hier Beispielcode

HINWEIS: Es ist zwar möglich, Paint.NET-Plugins in verschiedenen Programmiersprachen zu schreiben, aber die meisten Plugins sind in C#.NET geschrieben und werden mit dem CodeLab-Plugin entwickelt. Falls Sie dies noch nicht getan haben, installieren Sie das CodeLab-Plugin, damit Sie den hier vorgestellten Lektionen folgen können.

Das erste, was Ihnen an der Funktion Render() auffallen wird, ist, dass drei Informationen an die Funktion übergeben werden: die Zielfläche, die Quellfläche und das Rechteck von Interesse. Die grundlegendste Aufgabe der Funktion Render() besteht darin, jedes Pixel auf der Zielfläche innerhalb der Grenzen des Rechtecks von Interesse zu beschreiben. Dazu müssen Sie Zugriff auf die gesamte Quellfläche haben, die die Bitmap der aktuellen Ebene vor Beginn des Effekts enthält. Auch wenn Sie Zugriff auf die gesamte Zielfläche haben, sollten Sie nur in die Pixel schreiben, die innerhalb des ROI liegen.

Hier Beispielbild

Wenn man sich die obige Funktion Render() ansieht, kann man feststellen, dass es zwei Schleifen gibt (eine innerhalb der anderen). Die äußere Schleife, y, verarbeitet jeweils eine Zeile der ROI. Innerhalb dieser Schleife gibt es eine weitere Schleife, x, die jeweils eine Spalte (Pixel) der ROI verarbeitet. Die Schleifen bleiben innerhalb der aktuellen ROI, indem sie das übergebene "rect" verwenden, das die Position und Größe der aktuellen ROI für diesen Thread beschreibt.

Die Zeile "CurrentPixel = src[x,y];" liest ein Pixel von der Quellfläche in die Variable CurrentPixel. Die Zeile "dst[x,y] = CurrentPixel;" speichert dieses Pixel auf der Zielfläche. Ihre Aufgabe ist es nun, sich einen Algorithmus auszudenken, der dieses Pixel auf seinem Weg von der Quell- zur Zielfläche verändert (oder auch nicht). Ersetzen Sie dazu einfach die Kommentarzeile "// TODO:" durch Ihren Algorithmus (Formel).

~~Ich behaupte nicht, dass es einfach ist, den Algorithmus für den gewünschten Effekt herauszufinden. Aber wenn Sie alle Lektionen hier absolviert haben, werden Sie vielleicht feststellen, dass es gar nicht so schwer ist, wie Sie es sich vorgestellt haben.

Nun, da Sie ein grundlegendes Verständnis davon haben, wie Paint.NET mit Effekten arbeitet, denke ich, dass Sie bereit sind, sich in die Lektionen hier zu vertiefen und mit der Erstellung Ihrer eigenen Effekte zu beginnen! ~~

Alle Seiten mit Tag Codelab