Bildvektorisierung – Arbeitsablauf – .NET

In diesem Artikel wird erläutert, wie Sie Bitmaps mithilfe der Aspose.SVG-API in Vektorgrafiken konvertieren. Sie finden eine Beschreibung des Bildvektorisierungsprozesses; Verwendung von Vektorisierungsalgorithmen und -optionen. Erfahren Sie, wie Sie Rasterbilder wie PNG, JPG, BMP, TIFF, GIF, ICO in ein SVG-Dokument vektorisieren.

Aspose.SVG bietet einen kostenlosen Online- Bild-Vektorisierer, der browserbasiert ist und auf jeder Plattform funktioniert. Mit dieser App können Sie eine Reihe von Optionen anwenden, um das perfekte Ergebnis zu erzielen. Sparen Sie Zeit und testen Sie diesen kostenlosen Image Vectorizer, um alle Vorteile von Vektorgrafiken zu nutzen!

Text „Banner Image Vectorizer“

Was ist Bildvektorisierung (Image Stencil)?

Die Aufgabe bei der Vektorisierung besteht darin, ein 2D-Bild in eine 2D-Vektordarstellung des Bildes umzuwandeln. Bei den zweidimensionalen Vektorgrafiken handelt es sich um Computergrafikbilder, die als mathematische Kurven dargestellt werden. Solche Vektorbilder werden als kartesische Punkte definiert, die durch Linien und Kurven verbunden sind, um die erforderlichen Formen zu bilden. Ein Rasterbild ist eine Reihe von Pixeln. Wenn es sich um ein RGB-Bild handelt, kann es als Tabelle mit Farbpixeln dargestellt werden. Jedes Pixel ist ein Triplett aus 8-Bit-Ganzzahlwerten, wobei jeder Wert eine Menge an roter, grüner und blauer Farbe darstellt.

Bei der Bildvektorisierung handelt es sich um den Prozess der Umwandlung von Rasterbildern in Vektorgrafiken – Bezier-Kurven, Splines und Linien.

Das Quellbild für die Raster-zu-Vektor-Konvertierung akzeptiert möglicherweise Bitmap-Formate wie JPG, TIFF, BMP, GIF und PNG. Das Ausgabebild ist ein Vektordateiformat, beispielsweise das SVG-Dateiformat. Für die Vektorisierung eignen sich Bilder wie Karten, Icons, Logos, technische Zeichnungen und Cliparts. Diese Bilder basieren auf geometrischen Formen und werden mit einfachen Kurven gezeichnet.

Wozu dient die Bildvektorisierung?

Skalierung und Größe. Rasterbilder sind pixelbasiert und daher auflösungsabhängig. Die Bildqualität hängt von der Anzahl der Pixel ab, aus denen das Bild besteht, und vom Wert der Auflösung, der bestimmt, wie viele Pixel pro Zoll angezeigt werden. Je mehr Pixel das Bild enthält und je höher die Auflösung, desto höher ist die Bildqualität. Wenn Sie beispielsweise eine Bitmap skalieren, um sie zu vergrößern, ohne die Auflösung zu ändern, führt dies zu Qualitätsverlusten und erscheint verschwommen oder pixelig. Dies liegt daran, dass Pixel über einen größeren Bereich gestreckt werden und dadurch weniger scharf sind. Im Gegensatz zu Bitmap-Grafiken können Vektorbilder ohne Qualitätsverlust in der Größe geändert und skaliert werden und werden dennoch genauso klar angezeigt. Mit anderen Worten: Vektorgrafiken haben gegenüber Rastergrafiken den einzigartigen Vorteil, dass Punkte, Linien und Kurven ohne Qualitätsverlust vergrößert oder verkleinert werden können.

Sicherheit und Privatsphäre. Manchmal ist es notwendig, Bilder vor Bilderkennungstechniken wie der Gesichtserkennung zu schützen. Vektorisierte Bilder sind widerstandsfähiger gegen solche Angriffe, da Bilderkennungsprogramme in der Regel pixelorientiert sind.

Wiederherstellung von Bildern. Mithilfe der Vektorisierung können Bilder aktualisiert oder wiederhergestellt werden.

Bildvektorisierungsprozess

Der Bildvektorisierungsprozess umfasst die nächsten Schritte:

Farbquantisierung und Größenänderung. Bei der Farbquantisierung oder Farbbildquantisierung handelt es sich um eine auf Farbräume angewendete Quantisierung. Dabei handelt es sich um einen Prozess, der die Anzahl der in einem Bild verwendeten unterschiedlichen Farben reduziert, mit der Absicht, dass das neue Bild dem Originalbild optisch so ähnlich wie möglich ist. In unserem Bildvektorisierungsprozess spielt die Farbquantisierung eine wichtige Rolle, da sie die Anzahl der verwendeten Farben reduziert, die sich erheblich auf die Größe und Qualität der vektorisierten SVG-Datei auswirken. Wenn das Bild riesig ist oder viele kleine gleichfarbige Punkte oder Pixel enthält, ändern wir die Größe, um zu verhindern, dass das SVG-Dokument zu groß wird.

Konturverfolgung. Konturverfolgung oder Grenzverfolgung ist eine Technik, die auf digitale Bilder angewendet wird, um deren Grenze(n) für nicht-monochrome Bilder zu extrahieren. Es gibt mehrere solcher Techniken wie Suzuki-Abe, Moore-Neighbor, Square Tracing-Algorithmus, Theo Pavlidis-Algorithmus usw. Leider funktionieren diese Algorithmen mit monochromen Bildern und funktionieren nicht optimal mit mehrfarbigen Bildern. Deshalb haben wir einen neuen Konturverfolgungsalgorithmus entwickelt, der mit mehrfarbigen Bildern schnell und präzise arbeitet und die Anzahl der Konturen deutlich reduziert.

Spurglättung (dieser Schritt ist optional). Manchmal sehen Konturfragmente wie Sägezahnwellen aus, weil die Auflösung der vektorisierten Bilder nicht hoch genug ist oder das Bild verrauscht ist. Zur Glättung dieser Kurven können viele Ansätze wie lokale lineare Regression, lokale Polynomregression, Gaußscher Kernel usw. verwendet werden. Wir haben festgestellt, dass mit Hilfe des Nearest Neighbor-Ansatzes, der im ImageTraceSmoother Klasse.

Trace-Vereinfachung (optional). In diesem Schritt muss die aus Liniensegmenten bestehende Spurkurve auf eine ähnliche Kurve mit weniger Punkten reduziert werden. Es gibt verschiedene Algorithmen wie Ramer-Douglas-Peucker, Visvalingam-Whyatt, Reumann-Witkam usw., die zur Lösung dieser Aufgabe verwendet werden können. Wir haben den Ramer-Douglas-Peucker-Ansatz in der Klasse ImageTraceSimplifier implementiert, weil er in unseren Experimenten ein besseres Ergebnis als andere zeigte, aber wir haben die Schnittstelle IImageTraceSimplifier für die Implementierung anderer Ansätze deklariert.

SVG-Pfadelemente aus den Spuren erstellen. Der letzte Schritt besteht darin, die Verfolgungspunkte in SVG-Pfadlinien und Bezier-Kurven umzuwandeln und sie dem SVG-Dokument hinzuzufügen. Um die durch jeden Verfolgungspunkt verlaufenden Kurven anzupassen, verwenden wir einen Catmull-Roma-Spline, der in Bezier-Kurven umgewandelt wird.

Vektorisierungsoptionen

Sie können ein Rasterbild mithilfe von Standard- oder benutzerdefinierten Konfigurationsoptionen in eine Vektorgrafik konvertieren. Sie können benutzerdefinierte Einstellungen anwenden, um das beste Ergebnis der Bild-zu-Vektor-Konvertierung zu erzielen, und die ausgegebene SVG-Datei auf Ihrem Computer speichern. Die Verarbeitung übernimmt die Kontrolle über folgende Eigenschaften:

PropertyDescription
ColorsLimitThis property gets or sets the maximum number of colors used to quantize an image. The default value is 25.
ImageSizeLimitGets or sets maximal dimension of an image determined by multiplication image width and height. The size of the image will be scaled based on this property. The default value is 1800000.
PathBuilderThis property sets the SVG path segments builder and affects how sharply the curve bends at the control points.
TraceSimplifierThe property sets the trace simplified. As a result, the trace curve will be built composed of line segments with fewer (or bigger) points.
TraceSmootherThis property sets the trace smoother. It is used to smooth out fragments of contours.

C#-Beispiel

Die Aspose.HTML-API stellt den Namespace ImageVectorization bereit, der verschiedene Klassen realisiert, die die Implementierung einer Reihe von Algorithmen für den Bildvektorisierungsprozess ermöglichen. Mit den bereitgestellten Klassen und Methoden können Sie mit mehreren Vektorisierungsoptionen arbeiten, um Bilder vorzuverarbeiten, bevor Sie sie im Vektorformat speichern.

Hinweis: Die Aspose.SVG-API zielt darauf ab, Bildvektorisierungsaufgaben zu implementieren, sodass das Quellbild für die Raster-zu-Vektor-Konvertierung möglicherweise Bitmap-Formate wie JPG, PNG, BMP, TIFF, GIF usw. Das Ausgabebild ist ein Vektordateiformat SVG.

Um ein Bild mit Aspose.SVG zu vektorisieren, sollten Sie einige Schritte befolgen:

  1. Initialisieren Sie eine Instanz der Klasse ImageVectorizer. Verwenden Sie einen der ImageVectorizer()-Konstruktoren und geben Sie Konfigurationseigenschaften an.
  2. Vektorisieren Sie das Rasterbild aus der angegebenen Datei. Verwenden Sie die Methode Vectorize(), die ein SVGDocument zurückgibt.
  3. Speichern Sie das SVG-Dokument (vektorisiertes Bild) als SVG-Datei.

Hier ist ein C#-Beispiel für die Vektorisierung von PNG-Bildern mithilfe der Aspose.SVG-API.

 1using System.IO;
 2using Aspose.Svg.ImageVectorization;
 3using Aspose.Svg.Saving;
 4...
 5
 6	var vectorizer = new ImageVectorizer
 7        {
 8            Configuration =
 9            {
10                PathBuilder = new SplinePathBuilder
11                {
12                    TraceSmoother =   new ImageTraceSmoother(2),
13                    TraceSimplifier = new ImageTraceSimplifier(0.1f),
14                },
15                ColorsLimit = 2
16            }
17        };
18
19        using var document = vectorizer.Vectorize(Path.Combine(DataDir, "png-to-svg.png"));
20        
21        document.Save(Path.Combine(OutputDir, "png-to-svg.svg"));

Sie können die Quelldatei und das Endergebnis anzeigen, indem Sie den Links folgen – png-to-svg.png, png-to-svg.svg.

Die Beschreibung und C#-Beispiele der anwendbaren Vektorisierungsoptionen finden Sie im Artikel Beispiele zur Bildvektorisierung.

Beispiel für die IImageTraceSimplifier-Implementierung

Der Namespace ImageVectorization umfasst die Schnittstellen IImageTraceSimplifier, IImageTraceSmoother und IPathBuilder zur Realisierung beliebiger Ihrer Ansätze und Algorithmen. Betrachten wir die Implementierung von IImageTraceSimplifier basierend auf dem Viswalingam-Algorithmus:

  1	struct Point3
  2    {
  3        public float X { get; set; }
  4        public float Y { get; set; }
  5        public float? Z { get; set; }
  6        public Point3(float x, float y, float? z)
  7        {
  8            X = x;
  9            Y = y;
 10            Z = z;
 11        }
 12    }
 13
 14    internal class Visvalingam: IImageTraceSimplifier
 15    {
 16        Point3[] line;
 17        List<int> indizes;
 18        bool enriched;
 19        float tolerance;
 20
 21        public Visvalingam(float tolerance)
 22        {
 23            this.tolerance = tolerance;
 24        }
 25
 26        // Calculate the area of one triangle
 27        private float GetTriangleArea(Point3 a, Point3 b, Point3 c)
 28		{
 29            return Math.Abs((a.X * (b.Y - c.Y) + b.X * (c.Y - a.Y) + c.X * (a.Y - b.Y)) / 2f);
 30        }
 31
 32        // Add the area of the triangle to each point
 33        private float EnrichPoints()
 34		{
 35            var minArea = float.PositiveInfinity;
 36
 37            for (var i = 1; i < indizes.Count() - 1; i++)
 38            {
 39                var @this = indizes[i];
 40                var prev = indizes[i - 1];
 41                var next = indizes[i + 1];
 42				
 43                var area = GetTriangleArea(line[prev], line[@this], line[next]);
 44
 45                // Reset minim value for area, if current is smaller than all previous
 46                if (area < minArea)
 47
 48                    minArea = area;
 49
 50                // Save the area of the triangle as 3rd coordinate
 51                // Replace if it does exist already
 52                line[@this].Z = area;
 53            }
 54            return minArea;
 55        }
 56
 57        // Check for the smallest triangles and remove corresponding points from the index
 58        private void RemoveSmallestAreaIndex(float minArea)
 59        {
 60            var newIndizes = new List<int>();
 61            newIndizes.Add(indizes[0]);
 62			
 63            for (var i = 1; i < indizes.Count - 1; i++)
 64            {
 65                var index = indizes[i];
 66
 67                if (line[index].Z > minArea)
 68
 69                    newIndizes.Add(index);
 70            }
 71
 72            newIndizes.Add(indizes[indizes.Count - 1]);
 73            indizes = newIndizes;
 74
 75            // Return newIndizes
 76        }
 77
 78        // Do Visvalingam-Calculations until only start-& endpoint are left
 79        private void EnrichLineString()
 80        {
 81            while (indizes.Count > 2)
 82
 83                RemoveSmallestAreaIndex(EnrichPoints());
 84
 85            enriched = true;
 86        }
 87
 88        // Simplify a linestring corresponding to a given tolerance (depends on projection of data)
 89
 90        public IEnumerable<PointF> Simplify(IEnumerable<PointF> trace)
 91        {
 92            line = trace.Select(pt => new Point3(pt.X, pt.Y, null)).ToArray();
 93            indizes = line.Select((v, i) => i).ToList();
 94            enriched = false;
 95
 96            // It is enough to enrich the line once
 97            if (enriched == false)
 98			
 99                EnrichLineString();
100
101            // Build the new line
102            return line.Where(p => p.Z != null && (p.Z > tolerance) || p.Z == null)
103
104                .Select(p => new PointF(p.X, p.Y));
105        }
106    }

Sie können die vollständigen C#-Beispiele und Datendateien von GitHub herunterladen. Informationen zum Herunterladen von GitHub und zum Ausführen von Beispielen finden Sie im Abschnitt So führen Sie die Beispiele aus.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.