Arbeiten mit Bildern in C#: Größenänderung und Zuschneiden (Resize, Crop)
\n\nIn der modernen Webentwicklung und bei Desktop-Anwendungen müssen Bilder oft programmatisch verarbeitet werden: Verkleinern zur Beschleunigung des Ladens, Erstellen von Miniaturansichten oder Zuschneiden überflüssiger Ränder. Im .NET-Ökosystem gibt es mehrere Ansätze, um diese Aufgaben zu lösen. In diesem Artikel betrachten wir zwei Hauptmethoden zur Größenänderung (Resize) und zum Zuschneiden (Crop) von Bildern in C#: das klassische System.Drawing und das moderne plattformübergreifende SixLabors.ImageSharp.
1. Verwendung von System.Drawing (Windows Forms / .NET Framework)
\nDie klassische Methode, verfügbar in .NET Framework und .NET Core/5+ (mit Einschränkungen unter Linux/macOS). Funktioniert über den Namespace System.Drawing und die Klasse Bitmap. Geeignet für ältere Projekte oder Windows-Only-Anwendungen.
Beispiel: Größenänderung unter Beibehaltung der Proportionen
\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\n\npublic static Bitmap ResizeImage(Image image, int newWidth, int newHeight)\n{\n var destRect = new Rectangle(0, 0, newWidth, newHeight);\n var destImage = new Bitmap(newWidth, newHeight);\n\n using (var graphics = Graphics.FromImage(destImage))\n {\n graphics.CompositingMode = CompositingMode.SourceCopy;\n graphics.CompositingQuality = CompositingQuality.HighQuality;\n graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;\n graphics.SmoothingMode = SmoothingMode.HighQuality;\n graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;\n\n using (var wrapMode = new ImageAttributes())\n {\n wrapMode.SetWrapMode(WrapMode.TileFlipXY);\n graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);\n }\n }\n return destImage;\n}\n\n// Verwendung:\nusing (var original = Image.FromFile("input.jpg"))\n{\n using (var resized = ResizeImage(original, 800, 600))\n {\n resized.Save("output.jpg", ImageFormat.Jpeg);\n }\n}\n\nBeispiel: Zuschneiden (Crop) eines Bildes
\npublic static Bitmap CropImage(Image source, Rectangle cropArea)\n{\n var bmp = new Bitmap(cropArea.Width, cropArea.Height);\n using (var g = Graphics.FromImage(bmp))\n {\n g.DrawImage(source, new Rectangle(0, 0, bmp.Width, bmp.Height),\n cropArea, GraphicsUnit.Pixel);\n }\n return bmp;\n}\n\n// Verwendung:\nvar cropRect = new Rectangle(100, 50, 300, 200); // X, Y, Width, Height\nusing (var cropped = CropImage(Image.FromFile("input.jpg"), cropRect))\n{\n cropped.Save("cropped.jpg", ImageFormat.Jpeg);\n}\n\n2. SixLabors ImageSharp (plattformübergreifendes .NET)
\nSixLabors.ImageSharp ist eine moderne, vollständig verwaltete Bibliothek zur Bildverarbeitung, die auf .NET Core, .NET 5/6/7+ und .NET Framework läuft. Sie ist nicht von der Windows-API abhängig und daher ideal für Webanwendungen (ASP.NET Core), Konsolentools und Docker-Container geeignet.
\n\nInstallation über NuGet:
\ndotnet add package SixLabors.ImageSharp\n\nBeispiel: Größenänderung unter Beibehaltung der Proportionen
\nusing SixLabors.ImageSharp;\nusing SixLabors.ImageSharp.Processing;\n\npublic static void ResizeImageSharp(string inputPath, string outputPath, int width, int height)\n{\n using (var image = Image.Load(inputPath))\n {\n // ResizeMode.Pad — passt das Bild ein, fügt transparente/weiße Ränder hinzu\n // ResizeMode.Crop — schneidet auf die angegebenen Maße zu\n // ResizeMode.Max — behält Proportionen bei, passt in das Rechteck ein\n image.Mutate(x => x.Resize(width, height, KnownResamplers.Lanczos3));\n image.Save(outputPath);\n }\n}\n\n// Beispiel mit Proportionen (au