إنشاء الأصول البصرية برمجيًا هو متطلب أساسي في العديد من تطبيقات .NET، من عرض التقارير على الخادم وإنشاء الصور المصغرة إلى إنشاء المخططات الديناميكية وخطوط الأنابيب لإضافة العلامات المائية. بينما خدمت System.Drawing مطوري .NET لسنوات، فإنها تحمل قيودًا معروفة: فهي ليست آمنة للخطوط المتعددة، وتؤدي أداءً ضعيفًا تحت الحمل، ولا يتم دعمها رسميًا على المنصات غير Windows في .NET 6+.

Aspose.Drawing for .NET هو بديل جاهز يُستبدل به، متعدد المنصات، يوفر خط أنابيب عرض أسرع، واجهات برمجة تطبيقات آمنة للخيوط، ودعمًا أصليًا للـ BMP و PNG و JPEG و GIF و TIFF، وأكثر — كل ذلك دون الحاجة إلى برامج ترميز خارجية أو تبعيات GDI+.

هذا الدليل يشرح لك كل ما تحتاجه لإنشاء ورسم الصور النقطية (bitmaps) في C# باستخدام Aspose.Drawing: إعداد المشروع، رسم الأشكال والنص، إدارة الذاكرة، تحسين الأداء، وأفضل الممارسات للإنتاج.

إنشاء ورسم على صور البت ماب باستخدام Aspose.Drawing for .NET

المتطلبات المسبقة

  • .NET 6.0 أو أحدث (يوصى باستخدام Visual Studio 2022 أو JetBrains Rider)
  • مدير الحزم NuGet أو .NET CLI

1. التثبيت عبر وحدة تحكم مدير الحزم NuGet

Install-Package Aspose.Drawing

أو باستخدام .NET CLI:

dotnet add package Aspose.Drawing

بدلاً من ذلك، قم بتنزيل أحدث الملفات الثنائية مباشرةً من صفحة الإصدارات وارجع إلى ملف DLL يدويًا.

2. تطبيق ترخيص

بدون ترخيص، تعمل المكتبة في وضع التقييم، مما يضيف علامة مائية إلى الصور الناتجة. للاستخدام في بيئة الإنتاج، قم بتحميل الترخيص الخاص بك عند بدء تشغيل التطبيق:

new Aspose.Drawing.License().SetLicense("Aspose.Drawing.lic");

احصل على ترخيص مؤقت مجاني لتقييم غير مقيد. الأسعار الكاملة متاحة على صفحة التسعير.

خطوة بخطوة: إنشاء ورسم على Bitmap

الخطوة 1 — إنشاء كائن Bitmap
قم بإنشاء Bitmap بالعرض والارتفاع وتنسيق البكسل المطلوب. يُنصح باستخدام PixelFormat.Format32bppArgb للاستخدام العام — فهو يدعم الشفافية الكاملة (alpha) وهو أكثر تنسيقات البكسل توافقًا عبر أنواع الإخراج.

var bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);

الخطوة 2 — الحصول على سطح رسومي
استدعِ bitmap.GetGraphics() للحصول على كائن Graphics. يتم تنفيذ جميع عمليات الرسم عبر هذا الكائن. حافظ على وجود نسخة واحدة من Graphics طوال جلسة الرسم — إنشاء وتدمير نسخ متعددة على نفس الـ bitmap يُعد مضيعة للموارد.

using Graphics graphics = bitmap.GetGraphics();

الخطوة 3 — مسح الخلفية
ابدأ دائمًا باستدعاء صريح Clear(). بدون ذلك، تكون حالة بكسل الصورة الأولية غير معرفة وقد تحتوي على ضوضاء، خاصةً عندما يتم إعادة استخدام نفس المخزن المؤقت عبر الطلبات.

graphics.Clear(Color.White);

الخطوة 4 — رسم الأشكال والنص
استخدم مجموعة غنية من البدائل الرسومية: DrawRectangle، FillEllipse، DrawLine، DrawString، وأكثر. قِس النص قبل وضعه لتحقيق محاذاة دقيقة.

الخطوة 5 — حفظ وإلغاء
اكتب الـ bitmap إلى القرص باستخدام bitmap.Save()، مع تحديد ImageFormat المستهدف. قم بلف جميع الكائنات القابلة للتصرف في كتل using لضمان تنظيف الموارد.

bitmap.Save("output.png", ImageFormat.Png);

مثال كامل بلغة C#

يوضح تطبيق وحدة التحكم التالي سير العمل الكامل: إنشاء bitmap، تعبئة الخلفية، رسم الشكل، عرض النص في الوسط، وحفظه كملف PNG.

using System;
using Aspose.Drawing;
using Aspose.Drawing.Imaging;
using Aspose.Drawing.Drawing2D;

namespace BitmapDemo
{
    class Program
    {
        static void Main()
        {
            // 1. Create an 800x600 bitmap with 32-bit ARGB pixel format
            using (Bitmap bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb))
            {
                // 2. Obtain a Graphics surface — keep one instance for all operations
                using (Graphics graphics = bitmap.GetGraphics())
                {
                    // 3. Fill background — never skip this; uninitialized pixels cause visual noise
                    graphics.Clear(Color.White);

// 4. Draw a blue rectangle border (5px stroke)
                    using (Pen bluePen = new Pen(Color.Blue, 5))
                    {
                        graphics.DrawRectangle(bluePen, new Rectangle(100, 100, 600, 400));
                    }

// 5. Fill a red ellipse inside the rectangle
                    using (Brush redBrush = new SolidBrush(Color.Red))
                    {
                        graphics.FillEllipse(redBrush, new Rectangle(200, 150, 400, 300));
                    }

// 6. Render centered text using MeasureString for precise placement
                    using (Font font = new Font("Arial", 36, FontStyle.Bold))
                    using (Brush blackBrush = new SolidBrush(Color.Black))
                    {
                        string text = "Aspose.Drawing Demo";

// MeasureString returns the rendered text bounds at this font/size
                        SizeF textSize = graphics.MeasureString(text, font);

PointF location = new PointF(
                            (bitmap.Width  - textSize.Width)  / 2f,
                            (bitmap.Height - textSize.Height) / 2f
                        );

graphics.DrawString(text, font, blackBrush, location);
                    }
                }

// 7. Save as PNG — change ImageFormat to Jpeg, Bmp, Tiff, etc. as needed
                bitmap.Save("DemoOutput.png", ImageFormat.Png);
            }

Console.WriteLine("✓ Bitmap saved as DemoOutput.png");
        }
    }
}

قبل النشر إلى الإنتاج: قم بتحديث "DemoOutput.png" إلى مسار مطلق أو يتم حله وفقًا للبيئة. طبّق الترخيص الخاص بك قبل أي عملية رسم. اختبر عبر جميع صيغ الإخراج المستهدفة. راجع الوثائق الرسمية أو منتدى الدعم للحصول على المساعدة.

الأسئلة المتكررة

س: كيف يمكنني إنشاء ورسم على bitmap باستخدام Aspose.Drawing في C#؟
إنشاء كائن Bitmap مع العرض والارتفاع وPixelFormat، استدعاء bitmap.GetGraphics() للحصول على سطح Graphics، واستخدام طرق الرسم مثل DrawRectangle وFillEllipse وDrawString، ثم حفظه باستخدام bitmap.Save(). مثال الكود الكامل أعلاه يغطي سير العمل بالكامل.

س: ما هي تنسيقات الصور التي يدعمها Aspose.Drawing عند الحفظ؟
BMP، PNG، JPEG، GIF، TIFF، والعديد من التنسيقات الأخرى. حدد التنسيق عبر تعداد ImageFormat عند استدعاء Save() — على سبيل المثال، ImageFormat.Jpeg أو ImageFormat.Tiff. لا يلزم أي برامج ترميز خارجية.

س: كيف يمكنني منع تسرب الذاكرة عند معالجة عدد كبير من الصور؟
قم بلف كل Bitmap و Graphics و Pen و Brush و Font داخل كتلة using. أعد استخدام كائن Graphics لجميع عمليات الرسم على صورة bitmap واحدة بدلاً من إنشاء عدة مثيلات. تجنّب استدعاءات Clone() غير الضرورية.

س: هل Aspose.Drawing آمن للمعالجة المتوازية؟
نعم، على مستوى الـ bitmap. كل كائن Bitmap مستقل ويمكن معالجته في خيط منفصل. لا تشارك كائن Bitmap أو Graphics واحد عبر الخيوط دون مزامنة خارجية.

س: كيف يمكنني توسيط النص بدقة على صورة bitmap؟
استخدم graphics.MeasureString(text, font) للحصول على SizeF المُرَسَم لسلسلتك، ثم احسب النقطة العلوية اليسرى PointF كـ ((bitmapWidth - textWidth) / 2, (bitmapHeight - textHeight) / 2). هذا يعمل بشكل صحيح لأي حجم خط أو وزن أو طول سلسلة.

س: هل يمكنني استخدام Aspose.Drawing على Linux أو macOS في مشروع .NET 6+؟
نعم — هذا أحد المزايا الأساسية لـ Aspose.Drawing مقارنةً بـ System.Drawing. المكتبة متوافقة تمامًا عبر الأنظمة ولا تحتاج إلى أي تبعيات GDI+ أصلية.

الخلاصة

يمنح Aspose.Drawing for .NET مطوري C# واجهة برمجة تطبيقات رسم bitmap جاهزة للإنتاج وعبر الأنظمة، تُزيل قيود النظام ومخاوف أمان الخيوط الخاصة بـ System.Drawing. بأقل من 30 سطرًا من الشيفرة يمكنك إنشاء bitmap، ورسم الأشكال والنص مع مضاد التعرجات، وحفظه بأي تنسيق صورة رئيسي.

طبق أنماط إدارة الموارد واستراتيجيات المعالجة الدفعية المذكورة في هذا الدليل عند بناء خطوط معالجة الصور على نطاق واسع. للتقييم، احصل على رخصة مؤقتة مجانية. تفاصيل التسعير الكاملة موجودة في صفحة التسعير.

اقرأ المزيد

هل لديك أسئلة أو ملاحظات؟ قم بزيارة منتدى دعم Aspose.Drawing.