Arbeiten mit Bildern in C# (.NET): Von den Grundlagen bis zu fortgeschrittenen Techniken
Die Bildverarbeitung ist eine der Kernaufgaben in der modernen Entwicklung. Im C# (.NET)-Ökosystem gibt es mehrere leistungsstarke Bibliotheken für die Arbeit mit Grafiken, angefangen bei der integrierten System.Drawing bis hin zu modernen plattformübergreifenden Lösungen wie ImageSharp und SkiaSharp. In diesem Artikel werden wir die wichtigsten Ansätze im Detail besprechen, Codebeispiele zeigen und praktische Empfehlungen geben.
1. Überblick über Bibliotheken für die Bildverarbeitung in .NET
Die Wahl der Bibliothek hängt von Ihren Aufgaben und der Plattform ab. Hier sind drei Hauptoptionen:
- System.Drawing.Common — die klassische Bibliothek von Microsoft, verfügbar in .NET 6+. Funktioniert über GDI+ unter Windows, hat aber Einschränkungen unter Linux/macOS.
- SixLabors.ImageSharp — eine vollständig verwaltete, plattformübergreifende Bibliothek. Unterstützt die Formate JPEG, PNG, BMP, GIF, WebP. Ideal für Webanwendungen und serverseitige Verarbeitung.
- SkiaSharp — ein Wrapper um die Skia-Engine (verwendet in Chrome, Flutter). Bietet hohe Leistung und umfangreiche Möglichkeiten für 2D-Grafiken, einschließlich der Arbeit mit Bildern, Text und Vektorgrafiken.
Für die meisten modernen Projekte wird ImageSharp empfohlen — es ist einfach zu bedienen, wird aktiv weiterentwickelt und ist plattformunabhängig.
2. Installation und Einbindung der Bibliotheken
Installation über den NuGet Package Manager (oder .NET CLI):
// Für ImageSharpdotnet add package SixLabors.ImageSharp
// Für SkiaSharpdotnet add package SkiaSharp
// Für System.Drawing (falls benötigt)dotnet add package System.Drawing.Common3. Grundlegende Bildoperationen am Beispiel von ImageSharp
Betrachten wir die wichtigsten Operationen: Laden, Größenänderung, Zuschneiden, Anwenden von Filtern und Speichern.
3.1 Laden und Anzeigen von Informationen
using SixLabors.ImageSharp;using SixLabors.ImageSharp.PixelFormats;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ Console.WriteLine($"Breite: {image.Width}, Höhe: {image.Height}"); Console.WriteLine($"Pixelformat: {image.PixelType}");}3.2 Größenänderung unter Beibehaltung der Proportionen
using SixLabors.ImageSharp.Processing;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ int newWidth = 800; int newHeight = (int)((float)image.Height / image.Width * newWidth);
image.Mutate(x => x.Resize(newWidth, newHeight)); image.Save("output_resized.jpg");}3.3 Zuschneiden (Crop) des mittleren Bereichs
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ int cropSize = Math.Min(image.Width, image.Height); var rect = new Rectangle( (image.Width - cropSize) / 2, (image.Height - cropSize) / 2, cropSize, cropSize );
image.Mutate(x => x.Crop(rect)); image.Save("output_cropped.jpg");}3.4 Anwenden von Filtern (Schwarz-Weiß, Weichzeichnung)
using SixLabors.ImageSharp.Processing;using SixLabors.ImageSharp.Processing.Processors.Transforms;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ // Schwarz-Weiß-Filter image.Mutate(x => x.Grayscale());
// Gaußscher Weichzeichner (Radius 5) image.Mutate(x => x.GaussianBlur(5));
image.Save("output_filtered.jpg");}4. Arbeiten mit Formaten und Qualität
ImageSharp ermöglicht es, Speicherparameter für jedes Format festzulegen:
using SixLabors.ImageSharp.Formats.Jpeg;
using (Image<Rgba32> image = Image.Load<Rgba32>("input.jpg")){ var encoder = new J Auch in der Bibliothek
Caching in TypeScript: Redis, node-cache und andere Tools
E-Mail-Versand mit Go (Golang): Bibliotheken und Codebeispiele