Программная генерация визуальных ресурсов является основной потребностью во многих приложениях .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 Package Manager Console

Install-Package Aspose.Drawing

Или используя .NET CLI:

dotnet add package Aspose.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();

Step 3 — Очистка фона
Всегда начинайте с явного вызова Clear(). Без него начальное состояние пикселей битмапа неопределено и может содержать шум, особенно когда один и тот же буфер переиспользуется в разных запросах.

graphics.Clear(Color.White);

Шаг 4 — Рисование фигур и текста
Используйте богатый набор графических примитивов: 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" до абсолютного пути или пути, определяемого окружением. Примените вашу лицензию перед любой операцией рисования. Протестируйте все целевые форматы вывода. Смотрите официальную документацию или форум поддержки для получения помощи.

FAQ

Q: Как создать и рисовать на 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 для всех операций рисования на одном битмапе, вместо создания нескольких экземпляров. Избегайте ненужных вызовов Clone().

Q: Является ли Aspose.Drawing потокобезопасным для параллельной обработки?
Да, на уровне битмапа. Каждый экземпляр Bitmap независим и может обрабатываться в отдельном потоке. Не делитесь одним экземпляром Bitmap или Graphics между потоками без внешней синхронизации.

В: Как точно центрировать текст на битмапе?
Используйте 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# готовый к использованию, кроссплатформенный API для рисования растровых изображений, который устраняет ограничения платформы и проблемы потокобезопасности System.Drawing. С менее чем 30 строками кода вы можете создать растровое изображение, отрисовать фигуры и текст с антиалиасингом и сохранить в любой популярный формат изображения.

Применяйте шаблоны управления ресурсами и стратегии пакетной обработки, описанные в этом руководстве, при построении масштабируемых конвейеров обработки изображений. Для оценки получите бесплатную временную лицензию. Полная информация о ценах доступна на странице ценообразования.

Читать дальше

Есть вопросы или отзывы? Посетите форум поддержки Aspose.Drawing.