Программная генерация визуальных ресурсов является основной потребностью во многих приложениях .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 строками кода вы можете создать растровое изображение, отрисовать фигуры и текст с антиалиасингом и сохранить в любой популярный формат изображения.
Применяйте шаблоны управления ресурсами и стратегии пакетной обработки, описанные в этом руководстве, при построении масштабируемых конвейеров обработки изображений. Для оценки получите бесплатную временную лицензию. Полная информация о ценах доступна на странице ценообразования.
Читать дальше
- Использование System.Drawing в приложении Blazor WebAssembly на C#
- Как создать и рисовать битмапы в Java с Aspose.Drawing
- Как рисовать текст в C#
Есть вопросы или отзывы? Посетите форум поддержки Aspose.Drawing.
