Отображение графики Adobe Illustrator (AI) на сервере сложнее, чем кажется, и Type 1 function-based shading — одна из функций, которая сбивает с толку многих рендереров. Если ваш конвейер генерирует миниатюры, веб‑предпросмотры или печатные пруфы из AI‑файлов, вам необходимо, чтобы эта затенённость отрисовывалась корректно, а не заменялась сплошной заливкой. Aspose.PSD for .NET позволяет конвертировать AI‑файлы, содержащие Type 1 shading, в PNG на C# всего несколькими строками кода и без установки Adobe Illustrator. В этом руководстве мы пошагово рассмотрим установку SDK, загрузку AI‑файла, настройку PngOptions, экспорт многостраничных документов и обработку ошибок в продакшене.

Почему преобразовать затенение AI Type 1 в PNG

Современные файлы AI хранят свои изображения в структуре, совместимой с PDF, а PDF определяет несколько типов затенения для плавных переходов цветов. Тип 2 (аксиальный) и Тип 3 (радиальный) описывают линейные и круглые градиенты. Тип 1 затенения основан на функции: цвет в каждой точке вычисляется математической функцией её координат x и y. Это делает его очень гибким, но также означает, что рендереру необходимо вычислять функцию по всей затенённой области.

Когда рендерер не реализует затенение на основе функций, затенённая область обычно пропускается или закрашивается одним цветом, и экспортированное изображение больше не соответствует оригинальному дизайну. Aspose.PSD for .NET оценивает Type 1 shading внутренне во время рендеринга, поэтому сохраняемый PNG отражает произведение искусства в соответствии с дизайном.

С этой возможностью разработчики .NET могут:

  • Создавайте точные миниатюры и превью для систем управления цифровыми активами (DAM).
  • Публикуйте PNG‑версии иллюстраций Illustrator на веб‑сайтах и в приложениях, которые не могут отображать файлы AI.
  • Создавайте автоматизированные серверные конвейеры пакетного преобразования, работающие в Windows, Linux или в контейнерах.

Использование Aspose.PSD для преобразования затенения AI Type 1

Aspose.PSD for .NET — это библиотека C# для создания, редактирования и конвертации файлов Photoshop (PSD, PSB) и для загрузки и экспорта файлов Adobe Illustrator (AI). Она работает без Adobe Photoshop или Illustrator и распространяется как пакет NuGet.

Классы, используемые в этом руководстве:

  • Image (namespace Aspose.PSD): точка входа для загрузки любого поддерживаемого файла через Image.Load.
  • AiImage (namespace Aspose.PSD.FileFormats.Ai): представляет загруженный документ Illustrator и предоставляет члены, такие как PageCount и ActivePageIndex.
  • PngOptions (namespace Aspose.PSD.ImageOptions): управляет настройками экспорта PNG, такими как ColorType и CompressionLevel.
  • PngColorType (namespace Aspose.PSD.FileFormats.Png): выбирает формат пикселей PNG.

Установка

Установите пакет через консоль диспетчера пакетов:

Install-Package Aspose.PSD

Или с помощью .NET CLI:

dotnet add package Aspose.PSD

Вы можете узнать больше на странице продукта Aspose.PSD for .NET product page, в документация разработчика, и в справочник API.

1. Настройте ваш проект .NET

Создайте консольное приложение для размещения кода конвертации. Приведённые ниже примеры используют верхнеуровневые операторы и сопоставление с образцом C# 9, поэтому целевой платформой должна быть .NET 6 или новее.

  1. Создайте новый проект из командной строки или в Visual Studio:
dotnet new console -n AiShadingConversion
cd AiShadingConversion
  1. Добавьте пакет Aspose.PSD for .NET, используя одну из команд установки, показанных выше.
  2. Откройте Program.cs и добавьте необходимые директивы using в начале:
using System;
using System.IO;
using Aspose.PSD;
using Aspose.PSD.CoreExceptions;
using Aspose.PSD.FileFormats.Ai;
using Aspose.PSD.FileFormats.Png;
using Aspose.PSD.ImageOptions;

Aspose.PSD предоставляет класс Image, а Aspose.PSD.FileFormats.Ai содержит AiImage. PngOptions находится в Aspose.PSD.ImageOptions, в то время как Aspose.PSD.FileFormats.Png предоставляет перечисление PngColorType. Aspose.PSD.CoreExceptions содержит ImageLoadException, который вы будете использовать для обработки ошибок.

2. Загрузить AI‑файл, содержащий затенение типа 1

Image.Load автоматически определяет формат файла. Когда источник — документ Illustrator, возвращаемый объект является AiImage. Проверка типа с помощью сопоставления с образцом безопаснее, чем прямое приведение, поскольку прямое приведение бросает InvalidCastException, если кто‑то передаёт PSD или другой поддерживаемый формат.

Что делает код:

  • Формирует полный путь к исходному файлу AI.
  • Загружает файл с помощью Image.Load.
  • Подтверждает, что результат является AiImage, и выводит его размер и количество страниц.
string baseFolder = @"C:\Images";
string sourceFile = Path.Combine(baseFolder, "shadingType1.ai");

using (Image image = Image.Load(sourceFile))
{
    if (image is not AiImage aiImage)
    {
        Console.WriteLine("The source file is not an Adobe Illustrator document.");
        return;
    }

Console.WriteLine($"Loaded AI file: {aiImage.Width} x {aiImage.Height} px, pages: {aiImage.PageCount}");
}

Блок using освобождает изображение и высвобождает его ресурсы сразу после того, как вы закончите работу с ним. Специальная настройка для затенения не требуется: затенение типа 1 является частью содержимого документа и обрабатывается рендерером при сохранении.

3. Сохранить изображение как PNG

Экспорт в PNG выполняется одним вызовом Save, который принимает путь к выходному файлу и экземпляр PngOptions. Установка ColorType в PngColorType.TruecolorWithAlpha записывает 32‑битное изображение RGBA, чтобы сохранялась любая прозрачность, создаваемая рендерером, а CompressionLevel (от 0 до 9) меняет скорость кодирования в пользу размера файла.

Что делает код:

  • Создает папку вывода, если она не существует.
  • Загружает файл AI как AiImage.
  • Настраивает PngOptions и сохраняет отрендерированное изображение, включая затенение Type 1, в формате PNG.
string baseFolder = @"C:\Images";
string outputFolder = @"C:\Converted";
string sourceFile = Path.Combine(baseFolder, "shadingType1.ai");
string outputFile = Path.Combine(outputFolder, "shadingType1.png");

Directory.CreateDirectory(outputFolder);

using (var aiImage = (AiImage)Image.Load(sourceFile))
{
    var pngOptions = new PngOptions
    {
        ColorType = PngColorType.TruecolorWithAlpha,
        CompressionLevel = 6 // 0 = store (fastest), 9 = maximum compression
    };

aiImage.Save(outputFile, pngOptions);
    Console.WriteLine($"PNG saved to {outputFile}");
}

Откройте shadingType1.png в любом просмотрщике изображений и сравните его с оригинальным произведением, чтобы убедиться, что затенённые области отображаются как ожидалось.

Полный пример: преобразование затенения AI Type 1 в PNG на C#

Следующий Program.cs объединяет всё в одно готовое к производству консольное приложение. Он проверяет ввод, экспортирует каждую страницу многостраничного AI‑файла и обрабатывает ошибки загрузки.

using System;
using System.IO;
using Aspose.PSD;
using Aspose.PSD.CoreExceptions;
using Aspose.PSD.FileFormats.Ai;
using Aspose.PSD.FileFormats.Png;
using Aspose.PSD.ImageOptions;

// Optional: apply a license to remove the evaluation watermark.
// var license = new License();
// license.SetLicense("Aspose.PSD.NET.lic");

string sourceFile = @"C:\Images\shadingType1.ai";
string outputFolder = @"C:\Converted";

if (!File.Exists(sourceFile))
{
    Console.WriteLine($"Source file not found: {sourceFile}");
    return;
}

Directory.CreateDirectory(outputFolder);

var pngOptions = new PngOptions
{
    ColorType = PngColorType.TruecolorWithAlpha,
    CompressionLevel = 6
};

try
{
    using (Image image = Image.Load(sourceFile))
    {
        if (image is not AiImage aiImage)
        {
            Console.WriteLine("The source file is not an Adobe Illustrator document.");
            return;
        }

string baseName = Path.GetFileNameWithoutExtension(sourceFile);

// Legacy AI files report PageCount = 0, so treat them as a single page.
        if (aiImage.PageCount <= 1)
        {
            string outputFile = Path.Combine(outputFolder, $"{baseName}.png");
            aiImage.Save(outputFile, pngOptions);
            Console.WriteLine($"Saved {outputFile}");
        }
        else
        {
            for (int i = 0; i < aiImage.PageCount; i++)
            {
                aiImage.ActivePageIndex = i;
                string outputFile = Path.Combine(outputFolder, $"{baseName}_page{i + 1}.png");
                aiImage.Save(outputFile, pngOptions);
                Console.WriteLine($"Saved {outputFile}");
            }
        }
    }
}
catch (ImageLoadException ex)
{
    Console.WriteLine($"Could not load the AI file: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Conversion failed: {ex.Message}");
}

4. Советы, распространённые ошибки и соображения по производительности

Экспорт многостраничных AI файлов постранично

Документы Illustrator могут содержать несколько страниц (рабочих областей). AiImage.PageCount возвращает количество страниц, а ActivePageIndex выбирает страницу, которую рендерит Save. Установите индекс, сохраните и повторите, как показано в полном примере. Обратите внимание, что AiImage.Layers возвращает объекты AiLayerSection, описывающие структуру документа; они не являются отдельными изображениями, поэтому используйте страницы вместо слоёв, когда вам нужен один PNG на каждую рабочую область.

Используйте сопоставление с образцом вместо слепого приведения типов

Приведение типа, например (AiImage)Image.Load(path), допустимо, когда вы контролируете ввод. В обработчиках загрузки или пакетных заданиях предпочтительнее использовать image is AiImage aiImage, чтобы неожиданные форматы сообщались явно, а не вызывали InvalidCastException.

Управление памятью при пакетных конверсиях

Отображение больших или сложных изображений, особенно с функцией затенения, требует значительных ресурсов процессора и памяти. Всегда оборачивайте каждое загруженное изображение в блок using, обрабатывайте файлы по одному (или с небольшим ограниченным уровнем параллелизма) и повторно используйте один экземпляр PngOptions для всех файлов.

Сохранить прозрачность

Используйте PngColorType.TruecolorWithAlpha, когда PNG будет размещён поверх другого контента, например на веб‑странице или в графическом редакторе. Если альфа‑канал не нужен, вывод в truecolor без альфа‑канала создаёт файлы меньшего размера.

Обрабатывать ошибки явно

Проверьте, что входной файл существует перед его загрузкой, и перехватывайте ImageLoadException (пространство имен Aspose.PSD.CoreExceptions) для файлов, которые повреждены или не могут быть разобраны. Записывайте имя файла вместе с сообщением об исключении, чтобы неудачные элементы в пакете было легко повторно обработать.

Держите Aspose.PSD в актуальном состоянии

AI‑рендеринг постоянно улучшается от выпуска к выпуску, включая исправления для затенения, мягких масок и встроенных изображений. Если файл отображается иначе, чем ожидалось, обновите до последней версии пакета перед дальнейшим устранением неполадок.

Получить бесплатную лицензию

Без лицензии Aspose.PSD for .NET работает в режиме оценки и добавляет водяной знак к экспортированным изображениям. Запросите бесплатную временную лицензию, чтобы протестировать полный API в течение 30 дней, затем примените её перед первым вызовом Image.Load:

var license = new License();
license.SetLicense("Aspose.PSD.NET.lic");

Бесплатные дополнительные ресурсы

Заключение

Преобразование AI‑файлов с затенением на основе функций Type 1 в PNG на C# простое с Aspose.PSD for .NET. Установите пакет NuGet, загрузите файл с помощью Image.Load, настройте PngOptions и вызовите Save: библиотека оценивает затенение во время рендеринга, поэтому ваш PNG соответствует оригинальному изображению без Adobe Illustrator или внешних инструментов. При экспорте постранично, безопасных проверках типов и явной обработке ошибок тот же код масштабируется от одного предварительного просмотра до конвейеров массового серверного преобразования.

FAQs

1. Нужно ли лицензия для конвертации AI Type 1 shading в PNG? Лицензия не требуется для пробного использования, но без неё Aspose.PSD работает в режиме оценки, который добавляет водяной знак к результату. Вы можете запросить бесплатную 30‑дневную временную лицензию для оценки без ограничений. При использовании в продакшене требуется приобретённая лицензия.

2. Как конвертировать многостраничный AI‑файл в PNG на C#? Считайте свойство AiImage.PageCount, затем установите ActivePageIndex на каждый индекс страницы и вызовите Save, указав отдельный путь вывода. У старых AI‑файлов PageCount равен 0, поэтому их следует рассматривать как одностраничные.

3. Что происходит, если файл AI не содержит затенения типа 1?
Ничего не меняется в вашем коде. Aspose.PSD отображает всё, что содержит файл, включая другие типы градиентов, пути и встроенные изображения, и сохраняет результат в PNG.

4. Есть ли потеря качества при экспорте AI в PNG?
PNG — это формат без потерь, поэтому пиксели, созданные рендерером, сохраняются без артефактов сжатия. Размер вывода соответствует Width и Height, указанным в загруженном AiImage.

5. Какие версии .NET поддерживает Aspose.PSD for .NET? Aspose.PSD for .NET поддерживает как .NET Framework, так и современный .NET, а специализированные сборки для .NET 8 и .NET 9 поставляются начиная с версии 25.4. Проверьте вкладку Frameworks пакета Aspose.PSD на NuGet, чтобы узнать точные цели выпуска, который вы устанавливаете.

6. Как я могу контролировать уровень сжатия PNG? Установите PngOptions.CompressionLevel в значение от 0 (хранить, быстрее всего) до 9 (максимальное сжатие, наименьший файл) перед вызовом Save. Сжатие без потерь на каждом уровне, поэтому оно влияет только на размер файла и время кодирования.

Читать далее