Програмне створення візуальних ресурсів є основною вимогою у багатьох .NET застосунках, від серверного рендерингу звітів і генерації мініатюр до динамічного створення діаграм та конвеєрів водяних знаків. Хоча System.Drawing слугував розробникам .NET протягом багатьох років, він має добре відомі обмеження: не є потокобезпечним, погано працює під навантаженням і офіційно не підтримується на платформах, відмінних від Windows, у .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 package manager або .NET CLI

1. Встановити через консоль менеджера пакетів NuGet

Install-Package Aspose.Drawing

Або використовуючи .NET CLI:

dotnet add package Aspense.Drawing

Альтернативно, завантажте останні бінарні файли безпосередньо зі сторінки випусків та вручну підключіть DLL.

2. Застосувати ліцензію

Без ліцензії бібліотека працює в режимі оцінки, що додає водяний знак до вихідних зображень. Для використання у продакшн завантажте вашу ліцензію під час запуску програми:

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

Отримайте безкоштовну тимчасову ліцензію для необмеженої оцінки. Повна інформація про ціни доступна на сторінці цін.

Крок за кроком: створення та малювання на растровому зображенні

Крок 1 — Створення Bitmap
Створіть Bitmap з потрібною шириною, висотою та форматом пікселів. PixelFormat.Format32bppArgb рекомендується для загального використання — він підтримує повну альфа‑прозорість і є найсуміснішим форматом для різних типів виводу.

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

Крок 2 — Отримати графічну поверхню
Викличте bitmap.GetGraphics(), щоб отримати об’єкт Graphics. Усі операції малювання виконуються через цей об’єкт. Залишайте один екземпляр Graphics активним протягом усього сеансу малювання — створення та знищення кількох екземплярів на одному bitmap є марнотратством.

using Graphics graphics = bitmap.GetGraphics();

Крок 3 — Очистити фон
Завжди починайте з явного виклику Clear(). Без цього початковий стан пікселів bitmap не визначений і може містити шум, особливо коли один і той же буфер використовується повторно в різних запитах.

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" до абсолютного або визначеного середовищем шляху. Застосуйте вашу ліцензію перед будь‑якою операцією малювання. Протестуйте на всіх цільових форматах виводу. Перегляньте офіційну документацію або форум підтримки для отримання допомоги.

Часті питання

Q: Як створити та малювати на bitmap за допомогою Aspose.Drawing у C#?
Створіть Bitmap з шириною, висотою та PixelFormat, викличте bitmap.GetGraphics(), щоб отримати поверхню Graphics, використайте методи малювання, такі як DrawRectangle, FillEllipse та DrawString, а потім збережіть за допомогою bitmap.Save(). Повний приклад коду вище охоплює весь процес.

Q: Які формати зображень підтримує Aspose.Drawing для збереження?
BMP, PNG, JPEG, GIF, TIFF та кілька інших. Вкажіть формат за допомогою перерахування ImageFormat під час виклику Save() — наприклад, ImageFormat.Jpeg або ImageFormat.Tiff. Зовнішні кодеки не потрібні.

Q: Як запобігти витокам пам’яті під час обробки великої кількості зображень?
Обгорніть кожен Bitmap, Graphics, Pen, Brush та Font у блок using. Повторно використовуйте об’єкт Graphics для всіх малювань на одному bitmap, замість створення кількох екземплярів. Уникайте непотрібних викликів Clone().

Q: Чи є Aspose.Drawing потокобезпечним для паралельної обробки?
Так, на рівні bitmap. Кожен екземпляр Bitmap є незалежним і може оброблятися в окремому потоці. Не слід ділитися одним екземпляром Bitmap або Graphics між потоками без зовнішньої синхронізації.

Q: Як точно центрирувати текст на bitmap?
Використовуйте graphics.MeasureString(text, font), щоб отримати відрендерений SizeF вашого рядка, потім обчисліть координати верхнього лівого кута PointF як ((bitmapWidth - textWidth) / 2, (bitmapHeight - textHeight) / 2). Це працює коректно для будь‑якого розміру шрифту, його ваги або довжини рядка.

Q: Чи можу я використовувати Aspose.Drawing на Linux або macOS у .NET 6+ проєкті?
Так — це одна з головних переваг Aspose.Drawing над System.Drawing. Бібліотека повністю крос‑платформенна і не вимагає нативних залежностей GDI+.

Висновок

Aspose.Drawing for .NET надає розробникам C# готовий до продакшн, крос‑платформений API для малювання растрових зображень, який усуває обмеження платформи та проблеми безпеки потоків у System.Drawing. За допомогою менш ніж 30 рядків коду ви можете створити растрове зображення, відобразити форми та текст з антиаліасінгом і зберегти його у будь‑якому популярному форматі зображень.

Застосуйте шаблони управління ресурсами та стратегії пакетної обробки у цьому посібнику під час створення масштабованих конвеєрів обробки зображень. Для оцінки отримайте безкоштовну тимчасову ліцензію. Повна інформація про ціни доступна на сторінці цін.

Читати далі

Питання або відгуки? Відвідайте Aspose.Drawing форум підтримки.