العمل مع الصور في C# (.NET): تغيير الحجم والقص (resize, crop)
في تطوير الويب الحديث وتطبيقات سطح المكتب، غالبًا ما تكون هناك حاجة لمعالجة الصور برمجيًا: تغيير حجمها (resize) للمعاينات، قص (crop) الحواف الزائدة أو تكييفها مع تنسيق معين. تقدم منصة .NET عدة طرق لحل هذه المهام. في هذه المقالة، سنشرح بالتفصيل العمل مع مكتبة SixLabors.ImageSharp — وهي أداة قوية ومتعددة المنصات لمعالجة الصور في C#.
لماذا ImageSharp؟
سابقًا، كان الحل القياسي هو مكتبة System.Drawing، لكن لها قيود: تعمل فقط على Windows، وتتطلب مكونات GDI+ مثبتة، وهي غير محسّنة لتطبيقات الويب الحديثة. ImageSharp خالية من هذه العيوب:
- مكتوبة بالكامل بلغة C# المُدارة.
- تعمل على Windows، Linux، macOS.
- تدعم التنسيقات الشائعة: JPEG، PNG، BMP، GIF، WebP.
- أداء عالٍ وأمان.
تثبيت المكتبة
للبدء، قم بإنشاء مشروع C# جديد (.NET 6+) وقم بتثبيت الحزمة عبر NuGet:
dotnet add package SixLabors.ImageSharpأو عبر مدير الحزم في Visual Studio: Install-Package SixLabors.ImageSharp.
تغيير حجم الصورة (Resize)
تتيح وظيفة resize تصغير أو تكبير الصورة مع الحفاظ على النسب أو تحديد أبعاد دقيقة. لنلقِ نظرة على مثال حيث نقوم بتحميل صورة وتصغيرها إلى عرض 300 بكسل مع ضبط الارتفاع تلقائيًا:
using SixLabors.ImageSharp;using SixLabors.ImageSharp.Processing;
// تحميل الصورة الأصليةusing (Image image = Image.Load("input.jpg")){ // تغيير الحجم: العرض 300، الارتفاع يُحسب تلقائيًا image.Mutate(x => x.Resize(300, 0));
// حفظ النتيجة image.Save("output_resize.jpg");}باستخدام المعامل الثاني 0، نحدد أن الارتفاع يجب أن يُحسب تلقائيًا للحفاظ على النسب. إذا كنت بحاجة إلى أبعاد دقيقة (مثل 300x200)، حدد كلا القيمتين:
image.Mutate(x => x.Resize(300, 200)); // قد يحدث تشويه في النسبللحفاظ على النسب مع حجم دقيق، استخدم الوضع ResizeMode.Pad أو ResizeMode.Crop:
image.Mutate(x => x.Resize(new ResizeOptions{ Size = new Size(300, 200), Mode = ResizeMode.Crop // يقص الحواف ليتناسب مع الحجم}));قص الصورة (Crop)
يسمح القص (crop) باقتطاع منطقة مستطيلة من الصورة الأصلية. هذا مفيد لإنشاء الصور الرمزية أو الصور المصغرة أو إزالة الحواف الفارغة. مثال — نقوم بقص المنطقة المركزية بحجم 200x150 بكسل:
using (Image image = Image.Load("input.jpg")){ // تحديد إحداثيات وحجم المنطقة المراد قصها Rectangle cropRect = new Rectangle( x: (image.Width - 200) / 2, // توسيط أفقيًا y: (image.Height - 150) / 2, // توسيط رأسيًا width: 200, height: 150 );
// تنفيذ القص image.Mutate(x => x.Crop(cropRect));
// حفظ النتيجة image.Save("output_crop.jpg");}إذا كنت بحاجة إلى قص الصورة يدويًا (مثل الزاوية العلوية اليسرى 100x100):
image.Mutate(x => x.Crop(new Rectangle(0, 0, 100, 100)));دمج العمليات: resize + crop
غالبًا ما يكون من الضروري تغيير الحجم أولاً ثم القص إلى التنسيق المطلوب. تسمح ImageSharp بدمج العمليات في سلسلة:
using (Image image = Image.Load("input.jpg")){ // الخطوة 1: التصغير إلى عرض 400 بكسل (بشكل متناسب) image.Mutate(x =>