تولید دارایی‌های بصری به‌صورت برنامه‌نویسی یک نیاز اساسی در بسیاری از برنامه‌های .NET است، از رندر گزارش در سمت سرور و تولید تصویر بندانگشتی تا ایجاد نمودارهای پویا و خطوط لوله واترمارک. در حالی که System.Drawing سال‌ها به توسعه‌دهندگان .NET خدمت کرده است، محدودیت‌های شناخته‌شده‌ای دارد: ایمن برای چندین رشته نیست، تحت بار زیاد عملکرد ضعیفی دارد و به‌صورت رسمی در پلتفرم‌های غیر ویندوزی در .NET 6+ پشتیبانی نمی‌شود.

Aspose.Drawing for .NET یک جایگزین آماده، چندپلتفرمی است که یک خط لوله رندرینگ سریع‌تر، APIهای ایمن برای چندنخی، و پشتیبانی بومی از BMP، PNG، JPEG، GIF، TIFF و موارد دیگر را ارائه می‌دهد — همه اینها بدون کدک‌های خارجی یا وابستگی‌های GDI+.

این راهنما شما را در تمام مراحلی که برای ایجاد و رسم بر روی بیت‌مپ‌ها در 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");

یک مجوز موقت رایگان برای ارزیابی بدون محدودیت دریافت کنید. قیمت‌گذاری کامل در صفحه قیمت‌گذاری موجود است.

گام به گام: ایجاد و رسم بر روی یک بیت‌مپ

مرحله 1 — ایجاد یک Bitmap
یک Bitmap را با عرض، ارتفاع و فرمت پیکسل مورد نیاز ایجاد کنید. PixelFormat.Format32bppArgb برای استفاده عمومی توصیه می‌شود — این فرمت پشتیبانی کامل از شفافیت آلفا را دارد و سازگارترین فرمت در بین انواع خروجی است.

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

مرحله ۲ — دریافت یک سطح گرافیکی
متد bitmap.GetGraphics() را فراخوانی کنید تا یک شیء Graphics دریافت کنید. تمام عملیات رسم از طریق این شیء انجام می‌شود. یک نمونهٔ Graphics را برای تمام جلسهٔ رسم فعال نگه دارید — ایجاد و از بین بردن چندین نمونه روی همان bitmap هزینه‌بر است.

using Graphics graphics = bitmap.GetGraphics();

مرحله 3 — پاک‌سازی پس‌زمینه
همیشه با یک فراخوانی صریح Clear() شروع کنید. بدون آن، وضعیت اولیه پیکسل‌های بیت‌مپ تعریف نشده است و ممکن است نویز داشته باشد، به‌ویژه وقتی که همان بافر در درخواست‌های متعدد مجدداً استفاده می‌شود.

graphics.Clear(Color.White);

مرحله 4 — رسم اشکال و متن
از مجموعه غنی از primitiveهای رسم استفاده کنید: DrawRectangle، FillEllipse، DrawLine، DrawString و غیره. قبل از قرار دادن متن، آن را اندازه‌گیری کنید تا هم‌ترازی دقیق به دست آید.

مرحله 5 — ذخیره و آزادسازی
bitmap را با bitmap.Save() روی دیسک بنویسید و ImageFormat هدف را مشخص کنید. تمام اشیای قابل تخلیه را در بلوک‌های using بپیچید تا پاکسازی منابع تضمین شود.

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

مثال کامل کد C#

برنامهٔ کنسول زیر جریان کاری کامل را نشان می‌دهد: ایجاد بیت‌مپ، پر کردن پس‌زمینه، رسم شکل، رندر متن به صورت مرکزی، و ذخیره به فرمت 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" را به یک مسیر مطلق یا مسیر حل‌شده توسط محیط به‌روزرسانی کنید. مجوز خود را قبل از هر عملیات رسم اعمال کنید. در تمام فرمت‌های خروجی هدف تست کنید. برای دریافت کمک، به مستندات رسمی یا انجمن پشتیبانی مراجعه کنید.

سوالات متداول

Q: چگونه می‌توانم یک bitmap ایجاد کرده و روی آن رسم کنم با Aspose.Drawing در C#?
یک شی Bitmap را با عرض، ارتفاع و PixelFormat ایجاد کنید، با فراخوانی bitmap.GetGraphics() یک سطح Graphics دریافت کنید، از روش‌های رسم مانند DrawRectangle، FillEllipse و DrawString استفاده کنید، سپس با bitmap.Save() ذخیره کنید. مثال کامل کد در بالا تمام جریان کار را پوشش می‌دهد.

س: کدام فرمت‌های تصویر توسط Aspose.Drawing برای ذخیره‌سازی پشتیبانی می‌شود؟
BMP، PNG، JPEG، GIF، TIFF و چندین فرمت دیگر. فرمت را با استفاده از enum ImageFormat هنگام فراخوانی Save() مشخص کنید — برای مثال، ImageFormat.Jpeg یا ImageFormat.Tiff. هیچ کدک خارجی مورد نیاز نیست.

س: چگونه می‌توانم نشت حافظه را هنگام پردازش تعداد زیادی تصویر جلوگیری کنم؟
هر Bitmap، Graphics، Pen، Brush و Font را در یک بلوک using بپیچید. برای تمام رسم‌ها بر روی یک bitmap، شیء Graphics را مجدداً استفاده کنید به جای ایجاد چندین نمونه. از فراخوانی‌های غیرضروری Clone() خودداری کنید.

Q: آیا Aspose.Drawing برای پردازش موازی ایمن است؟
بله، در سطح بیت‌مپ. هر نمونه Bitmap مستقل است و می‌تواند در یک رشته جداگانه پردازش شود. بدون همگام‌سازی خارجی، یک نمونه Bitmap یا Graphics را بین رشته‌ها به اشتراک نگذارید.

Q: چگونه متن را به‌دقت بر روی یک bitmap مرکز کنم؟
از graphics.MeasureString(text, font) برای دریافت SizeF رندر شدهٔ رشتهٔ خود استفاده کنید، سپس نقطهٔ بالا‑چپ PointF را به صورت ((bitmapWidth - textWidth) / 2, (bitmapHeight - textHeight) / 2) محاسبه کنید. این روش برای هر اندازهٔ قلم، وزن یا طول رشته‌ای به‌درستی کار می‌کند.

س: آیا می‌توانم Aspose.Drawing را در لینوکس یا macOS در یک پروژه .NET 6+ استفاده کنم؟
بله — این یکی از مزایای اصلی Aspose.Drawing نسبت به System.Drawing است. این کتابخانه به‌صورت کامل چندپلتفرمی است و نیازی به وابستگی‌های بومی GDI+ ندارد.

نتیجه‌گیری

Aspose.Drawing for .NET به توسعه‌دهندگان C# یک API رسم بیت‌مپ آماده برای تولید و چندپلتفرمی ارائه می‌دهد که محدودیت‌های پلتفرم و نگرانی‌های ایمنی رشته‌ای System.Drawing را برطرف می‌کند. با کمتر از ۳۰ خط کد می‌توانید یک بیت‌مپ ایجاد کنید، اشکال و متن را با anti-aliasing رندر کنید و آن را در هر فرمت تصویر اصلی ذخیره کنید.

در این راهنما هنگام ساخت خطوط پردازش تصویر در مقیاس بزرگ، الگوهای مدیریت منابع و استراتژی‌های پردازش دسته‌ای را اعمال کنید. برای ارزیابی، یک مجوز موقت رایگان دریافت کنید. جزئیات کامل قیمت‌گذاری در صفحه قیمت‌گذاری موجود است.

ادامه مطلب

سوالات یا بازخورد؟ به Aspose.Drawing انجمن پشتیبانی.