العمل مع الصور في C#: تغيير الحجم والقص (resize, crop)
\n\nفي تطوير الويب الحديث وتطبيقات سطح المكتب، غالبًا ما تكون هناك حاجة لمعالجة الصور برمجيًا: تصغيرها لتسريع التحميل، إنشاء صور مصغرة، أو قص الحواف الزائدة. في نظام .NET البيئي، توجد عدة طرق لحل هذه المهام. في هذه المقالة، سنستعرض طريقتين رئيسيتين لتغيير الحجم (resize) وقص (crop) الصور في C#: الطريقة الكلاسيكية System.Drawing والطريقة الحديثة متعددة المنصات SixLabors.ImageSharp.
1. استخدام System.Drawing (Windows Forms / .NET Framework)
\nالطريقة الكلاسيكية، المتوفرة في .NET Framework و .NET Core/5+ (مع قيود على Linux/macOS). تعمل من خلال مساحة الأسماء System.Drawing والفئة Bitmap. مناسبة للمشاريع القديمة أو التطبيقات المخصصة لنظام Windows فقط.
مثال: تغيير الحجم مع الحفاظ على النسب
\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// الاستخدام:\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\nمثال: قص (crop) الصورة
\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// الاستخدام:\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. ImageSharp من SixLabors (متعدد المنصات .NET)
\nSixLabors.ImageSharp هي مكتبة حديثة ومدارة بالكامل لمعالجة الصور، تعمل على .NET Core و .NET 5/6/7+ و .NET Framework. لا تعتمد على Windows API، لذا فهي مثالية لتطبيقات الويب (ASP.NET Core) والأدوات الطرفية وحاويات Docker.
\n\nالتثبيت عبر NuGet:
\ndotnet add package SixLabors.ImageSharp\n\nمثال: تغيير الحجم مع الحفاظ على النسب
\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 — يلائم الصورة مع إضافة هوامش شفافة/بيضاء\n // وضع ResizeMode.Crop — يقص الصورة إلى الأبعاد المحددة\n // وضع ResizeMode.Max — يحافظ على النسب مع التلائم داخل المستطيل\n image.Mutate(x => x.Resize(width, height, KnownResamplers.Lanczos3));\n image.Save(outputPath);\n }\n}\n\n// مثال مع الحفاظ على النسب (تلقائيًا)