العمل مع الصور في C# (.NET): نظرة عامة على المكتبات وأمثلة عملية
معالجة الصور هي إحدى المهام الشائعة في التطبيقات الحديثة بلغة C# (.NET). سواء كان تحميل صورة المستخدم، إنشاء صور مصغرة، إضافة علامات مائية، أو تحويل التنسيقات - يقدم .NET العديد من الحلول القوية. في هذه المقالة، سنستعرض المكتبات الرئيسية، إمكانياتها، ونكتب أمثلة حقيقية للكود.
1. المكتبة القياسية: System.Drawing.Common
تاريخياً، أول وأشهر مكتبة هي System.Drawing.Common. توفر الوصول إلى GDI+ (واجهة جهاز الرسوميات) في Windows. ومع ذلك، لديها قيود مهمة:
- تعمل فقط على Windows (لـ .NET Core/.NET 5+ يتطلب حزمة
System.Drawing.Common، لكن الدعم على Linux/macOS محدود). - غير محسّنة لخدمات الويب عالية التحميل (تسرب الذاكرة عند الاستخدام غير الصحيح).
- لا تدعم التنسيقات الحديثة (WebP, AVIF) بشكل افتراضي.
مثال على تحميل وتغيير حجم الصورة:
using System.Drawing;using System.Drawing.Imaging;
public static void ResizeImage(string sourcePath, string destPath, int newWidth, int newHeight){ using (var image = Image.FromFile(sourcePath)) using (var resized = new Bitmap(newWidth, newHeight)) using (var graphics = Graphics.FromImage(resized)) { graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; graphics.DrawImage(image, 0, 0, newWidth, newHeight); resized.Save(destPath, ImageFormat.Jpeg); }}هذا الكود يقوم بتحميل الصورة الأصلية، إنشاء Bitmap جديد بالأبعاد المحددة، ورسم الصورة الأصلية عليه بجودة عالية. مناسب للمهام البسيطة.
2. المكتبة الحديثة متعددة المنصات: ImageSharp (SixLabors)
ImageSharp هي مكتبة مُدارة بالكامل لـ .NET، لا تعتمد على GDI+. تعمل على Windows و Linux و macOS. المزايا الرئيسية:
- كود C# نقي، بدون تبعيات أصلية.
- دعم WebP, PNG, JPEG, BMP, GIF, TIFF.
- فلاتر مدمجة، تدوير، قص، تغيير حجم.
- أداء عالٍ وأمان لتطبيقات الويب.
التثبيت: dotnet add package SixLabors.ImageSharp
مثال على تغيير الحجم والحفظ بتنسيق WebP:
using SixLabors.ImageSharp;using SixLabors.ImageSharp.Processing;using SixLabors.ImageSharp.Formats.Webp;
public static void ResizeToWebp(string input, string output, int width, int height){ using (var image = Image.Load(input)) { image.Mutate(x => x.Resize(width, height)); var encoder = new WebpEncoder { Quality = 80 }; image.Save(output, encoder); }}لاحظ: طريقة Mutate تطبق التغييرات على الصورة نفسها (بدون إنشاء نسخة)، مما يوفر الذاكرة.
3. محرك الرسوميات: SkiaSharp
SkiaSharp هو غلاف لمكتبة Skia (المستخدمة في Chrome, Android, Flutter). يوفر أقصى مرونة وأداء، خاصة للرسوميات ثنائية الأبعاد المعقدة.
- متعدد المنصات (Windows, Linux, macOS, المنصات المحمولة).
- دعم التسريع العتادي (GPU).
- مجموعة غنية من الأدوات: المسارات، الفرش، التظليل، الأقنعة.
مثال على إضافة علامة مائية:
using SkiaSharp;
public static void AddWatermark(string imagePath, string watermarkText, string outputPath){ using (var input = SKBitmap.Decode(imagePath)) using (var canvas = new SKCanvas(input)) using (var paint = new SKPaint { Color = SKColors.White.WithAlpha(128), TextSize =