Работа с прозрачностью в PostScript | .NET

Добавить прозрачность в документ PS

PostScript не поддерживает прозрачность при рисовании объектов векторной графики. Однако полупрозрачные (частично прозрачные) изображения можно визуализировать как набор полностью прозрачных и полностью непрозрачных пикселей. Такие изображения называются масками.

Библиотека Aspose.Page для .NET предлагает метод, который добавляет прозрачное изображение в документ PS. Что касается рисования векторной графики: фигур или текста, мы предлагаем “псевдопрозрачность”.

«Псевдопрозрачность» — это процесс обесцвечивания цветов, у которых альфа-компонент меньше 255. Это достигается путем специфического смешивания красного, зеленого и синего компонентов с альфа-компонентом.

“Псевдопрозрачность”, конечно, не позволяет увидеть нижний цветной слой из-под верхнего прозрачного слоя, но создает иллюзию прозрачности, если нижний слой белый.

Добавить прозрачное изображение в документ PS

Как мы писали ранее, прозрачные изображения можно добавлять в документ PS в качестве маски, и библиотека Aspose.Page для .NET предлагает для этой цели метод AddTransparentImage(). Этот метод определяет, является ли изображение полностью непрозрачным, полностью прозрачным или полупрозрачным. Если оно полностью непрозрачное, оно добавляется как непрозрачное изображение в методе AddImage(), если оно полностью прозрачное, оно вообще не добавляется в документ, если это полупрозрачное изображение, оно добавляется как изображение PostScript. маска.

В примере ниже мы демонстрируем разницу между добавлением прозрачного изображения в документ PS с помощью AddImage() и AddTransparentImage(). Чтобы увидеть белое полупрозрачное изображение, мы устанавливаем небелый цвет фона страницы.

Чтобы добавить любое изображение в новый PsDocument с помощью библиотеки Aspose.Page для .NET в этом примере, мы выполняем следующие шаги:

  1. Создайте выходной поток для полученного PS-файла.
  2. Создайте объект PsSaveOptions с параметрами по умолчанию. Если необходимо, измените цвет фона.
  3. Создайте одностраничный PsDocument с уже созданным потоком вывода и сохраните параметры.
  4. Создайте новое графическое состояние.
  5. Создайте Растровое изображение из файла изображения.
  6. Создайте необходимое преобразование изображения.
  7. Добавьте изображение в PsDocument как полностью непрозрачное изображение (с помощью метода AddImage()), если мы уверены, что изображение непрозрачное, или добавьте его как прозрачное изображение (с помощью метода AddTransparentImage()). если мы не уверены, что изображение непрозрачно.
  8. Выход из текущего состояния графики на верхний уровень.
  9. Закройте страницу.
  10. Сохраните документ.
 1//Create an output stream for PostScript document
 2using (Stream outPsStream = new FileStream(dataDir + "AddTransparentImage_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6    //Set page's background color to see white image on it's own transparent background
 7    options.BackgroundColor = Color.FromArgb(211, 8, 48);
 8
 9    // Create new 1-paged PS Document
10    PsDocument document = new PsDocument(outPsStream, options, false);
11
12
13    document.WriteGraphicsSave();
14    document.Translate(20, 100);
15
16    //Create a bitmap from translucent image file
17    using (Bitmap image = new Bitmap(dataDir + "mask1.png"))
18    {
19        //Add this image to the document as usual opaque RGB image
20        document.DrawImage(image, new Matrix(1, 0, 0, 1, 100, 0), Color.Empty);
21    }
22
23    //Again create a bitmap from the same image file
24    using (Bitmap image = new Bitmap(dataDir + "mask1.png"))
25    {
26        //Add this image to the document as transparent image
27        document.DrawTransparentImage(image, new Matrix(1, 0, 0, 1, 350, 0), 255);
28    }
29
30    document.WriteGraphicsRestore();
31
32    //Close current page
33    document.ClosePage();
34
35    //Save the document
36    document.Save();
37}

Для Linux, MacOS и других операционных систем, отличных от Windows, мы предлагаем использовать наш пакет Nuget Aspose.Page.Drawing. Он использует серверную часть Aspose.Drawing вместо системной библиотеки System.Drawing.

Поэтому импортируйте пространство имен Aspose.Page.Drawing вместо System.Drawing. В приведенном выше и последующих фрагментах кода вместо System.Drawing.Bitmap будет использоваться Aspose.Page.Drawing.Bitmap, вместо System.Drawing.Drawing2D.Matrix будет использоваться Aspose.Page.Drawing.Drawing2D.Matrix и т. д. . Наши примеры кода на GitHub содержат все необходимые замены.

См. работу с прозрачностью в документе PS в Java.

Результат запуска этого кода следующий

Добавить прозрачное изображение

Добавление прозрачного объекта векторной графики

Ранее мы писали, что библиотека Aspose.Page для .NET использует алгоритм очистки прозрачных фигур и текста, который мы назвали “псевдопрозрачностью”. В примере ниже мы демонстрируем разницу между двумя фигурами, окрашенными в один и тот же цвет, но в первой фигуре без компонента «Альфа», а во втором случае — с компонентом «Альфа».

 1//Create an output stream for PostScript document
 2using (Stream outPsStream = new FileStream(dataDir + "ShowPseudoTransparency_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6
 7    // Create new 1-paged PS Document
 8    PsDocument document = new PsDocument(outPsStream, options, false);
 9
10    float offsetX = 50;
11    float offsetY = 100;
12    float width = 200;
13    float height = 100;
14
15///////////////////////////////// Create a rectangle with opaque gradient fill /////////////////////////////////////////////////////////
16    GraphicsPath path = new GraphicsPath();
17    path.AddRectangle(new RectangleF(50, 100, 200, 100));
18
19    LinearGradientBrush opaqueBrush = new LinearGradientBrush(new RectangleF(0, 0, 200, 100), Color.FromArgb(0, 0, 0),
20        Color.FromArgb(40, 128, 70), 0f);
21    Matrix brushTransform = new Matrix(200, 0, 0, 100, 50, 100);
22    opaqueBrush.Transform = brushTransform;
23    Aspose.Page.EPS.GradientBrush gradientBrush = new GradientBrush(opaqueBrush);
24    gradientBrush.WrapMode = WrapMode.Clamp;
25
26    document.SetPaint(gradientBrush);
27    document.Fill(path);
28/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
29
30    offsetX = 350;
31
32///////////////////////////////// Create a rectangle with translucent gradient fill ///////////////////////////////////////////////////
33    //Create graphics path from the first rectangle
34    path = new GraphicsPath();
35    path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
36
37    //Create linear gradient brush colors which transparency are not 255, but 150 and 50. So it are translucent.
38    LinearGradientBrush translucentBrush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.FromArgb(150, 0, 0, 0),
39        Color.FromArgb(50, 40, 128, 70), 0f);
40    //Create a transform for the brush.
41    brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
42    //Set the transform
43    translucentBrush.Transform = brushTransform;
44    
45    //Set the paint
46    document.SetPaint(translucentBrush);
47    //Fill the rectangle
48    document.Fill(path);
49/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
50
51    //Close current page
52    document.ClosePage();
53
54    //Save the document
55    document.Save();
56}

См. работу с прозрачностью в документах PS в Java и C++.

Результат запуска этого кода выглядит так:

Показать псевдопрозрачность

Вы можете загрузить примеры и файлы данных с сайта GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.