معالجة الصور في C#: تغيير الحجم والقص (resize, crop)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع الصور في C#: تغيير الحجم والقص (resize, crop)

\n\n

في تطوير الويب الحديث وتطبيقات سطح المكتب، غالبًا ما تكون هناك حاجة لمعالجة الصور برمجيًا: تصغيرها لتسريع التحميل، إنشاء صور مصغرة، أو قص الحواف الزائدة. في نظام .NET البيئي، توجد عدة طرق لحل هذه المهام. في هذه المقالة، سنستعرض طريقتين رئيسيتين لتغيير الحجم (resize) وقص (crop) الصور في C#: الطريقة الكلاسيكية System.Drawing والطريقة الحديثة متعددة المنصات SixLabors.ImageSharp.

\n\n

1. استخدام System.Drawing (Windows Forms / .NET Framework)

\n

الطريقة الكلاسيكية، المتوفرة في .NET Framework و .NET Core/5+ (مع قيود على Linux/macOS). تعمل من خلال مساحة الأسماء System.Drawing والفئة Bitmap. مناسبة للمشاريع القديمة أو التطبيقات المخصصة لنظام Windows فقط.

\n\n

مثال: تغيير الحجم مع الحفاظ على النسب

\n
using 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) الصورة

\n
public 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\n

2. ImageSharp من SixLabors (متعدد المنصات .NET)

\n

SixLabors.ImageSharp هي مكتبة حديثة ومدارة بالكامل لمعالجة الصور، تعمل على .NET Core و .NET 5/6/7+ و .NET Framework. لا تعتمد على Windows API، لذا فهي مثالية لتطبيقات الويب (ASP.NET Core) والأدوات الطرفية وحاويات Docker.

\n\n

التثبيت عبر NuGet:

\n
dotnet add package SixLabors.ImageSharp
\n\n

مثال: تغيير الحجم مع الحفاظ على النسب

\n
using 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// مثال مع الحفاظ على النسب (تلقائيًا)                    

توصيات