Работа с прозрачностью в PostScript | С++
Добавить прозрачность в документ PS
PostScript не поддерживает прозрачность при рисовании объектов векторной графики. Однако полупрозрачные (частично прозрачные) изображения можно визуализировать как набор полностью прозрачных и полностью непрозрачных пикселей. Такие изображения называются масками.
Библиотека Aspose.Page для C++ предлагает метод, который добавляет прозрачное изображение в документ PS. Что касается рисования векторной графики: фигур или текста, мы предлагаем “псевдопрозрачность”.
«Псевдопрозрачность» — это процесс обесцвечивания цветов с альфа-компонентом менее 255. Это достигается путем специфического смешивания красного, зеленого и синего компонентов с альфа-компонентом.
“Псевдопрозрачность”, конечно, не позволяет увидеть нижний цветной слой из-под верхнего прозрачного слоя, но создает иллюзию прозрачности, если нижний слой белый.
Добавить прозрачное изображение в документ PS
Как мы писали ранее, прозрачные изображения можно добавлять в документ PS в качестве маски, и библиотека Aspose.Page для C++ предлагает для этой цели метод AddTransparentImage().
Этот метод определяет, является ли изображение полностью непрозрачным, полностью прозрачным или полупрозрачным. Если оно полностью непрозрачное, оно добавляется как непрозрачное изображение в методе AddImage(), если оно полностью прозрачное, оно вообще не добавляется в документ, если это полупрозрачное изображение, оно добавляется как изображение PostScript. маска.
В примере ниже мы демонстрируем разницу между добавлением прозрачного изображения в документ PS с помощью AddImage() и AddTransparentImage(). Чтобы увидеть белое полупрозрачное изображение, мы устанавливаем небелый цвет фона страницы.
Чтобы добавить любое изображение в новый PsDocument с помощью библиотеки Aspose.Page для C++, в этом примере мы выполняем следующие шаги:
- Создайте выходной поток для полученного PS-файла.
- Создайте объект PsSaveOptions с параметрами по умолчанию. Если необходимо, измените цвет фона.
- Создайте одностраничный PsDocument с уже созданным потоком вывода и сохраните параметры.
- Создайте новое графическое состояние.
- Создайте Растровое изображение из файла изображения.
- Создайте необходимое преобразование изображения.
- Добавьте изображение в PsDocument как полностью непрозрачное изображение (с помощью метода AddImage()), если мы уверены, что изображение непрозрачное, или добавьте его как прозрачное изображение (с помощью метода AddTransparentImage()). если мы не уверены, что изображение непрозрачно.
- Выход из текущего состояния графики на верхний уровень.
- Закройте страницу.
- Сохраните документ.
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithTransparency();
3
4 //Create output stream for PostScript document
5 {
6 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"AddTransparentImage_outPS.ps", System::IO::FileMode::Create);
7 // Clearing resources under 'using' statement
8 System::Details::DisposeGuard<1> __dispose_guard_2({ outPsStream});
9 // ------------------------------------------
10
11 try
12 {
13 //Create save options with A4 size
14 System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
15 //Set page's background color to see white image on it's own transparent background
16 options->set_BackgroundColor(System::Drawing::Color::FromArgb(211, 8, 48));
17
18 // Create new 1-paged PS Document
19 System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
20
21
22 document->WriteGraphicsSave();
23 document->Translate(20.0f, 100.0f);
24
25 //Create bitmap from translucent image file
26 {
27 System::SharedPtr<System::Drawing::Bitmap> image = System::MakeObject<System::Drawing::Bitmap>(dataDir + u"mask1.png");
28 // Clearing resources under 'using' statement
29 System::Details::DisposeGuard<1> __dispose_guard_0({ image});
30 // ------------------------------------------
31
32 try
33 {
34 //Add this image to document as usual opaque RGB image
35 document->DrawImage(image, System::MakeObject<System::Drawing::Drawing2D::Matrix>(1.0f, 0.0f, 0.0f, 1.0f, 100.0f, 0.0f), System::Drawing::Color::Empty);
36 }
37 catch(...)
38 {
39 __dispose_guard_0.SetCurrentException(std::current_exception());
40 }
41 }
42
43 //Again create bitmap from the same image file
44 {
45 System::SharedPtr<System::Drawing::Bitmap> image = System::MakeObject<System::Drawing::Bitmap>(dataDir + u"mask1.png");
46 // Clearing resources under 'using' statement
47 System::Details::DisposeGuard<1> __dispose_guard_1({ image});
48 // ------------------------------------------
49
50 try
51 {
52 //Add this image to document as transparent image image
53 document->DrawTransparentImage(image, System::MakeObject<System::Drawing::Drawing2D::Matrix>(1.0f, 0.0f, 0.0f, 1.0f, 350.0f, 0.0f), 255);
54 }
55 catch(...)
56 {
57 __dispose_guard_1.SetCurrentException(std::current_exception());
58 }
59 }
60
61 document->WriteGraphicsRestore();
62
63 //Close current page
64 document->ClosePage();
65
66 //Save the document
67 document->Save();
68 }
69 catch(...)
70 {
71 __dispose_guard_2.SetCurrentException(std::current_exception());
72 }
73 }
Результат запуска этого кода следующий
Добавление прозрачного объекта векторной графики
Ранее мы писали, что библиотека Aspose.Page для C++ использует алгоритм очистки прозрачных фигур и текста, который мы назвали “псевдопрозрачностью”. В примере ниже мы демонстрируем разницу между двумя фигурами, окрашенными в один и тот же цвет, но в первой фигуре без компонента «Альфа», а во втором случае — с компонентом «Альфа».
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithTransparency();
3
4 //Create output stream for PostScript document
5 {
6 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"ShowPseudoTransparency_outPS.ps", System::IO::FileMode::Create);
7 // Clearing resources under 'using' statement
8 System::Details::DisposeGuard<1> __dispose_guard_0({ outPsStream});
9 // ------------------------------------------
10
11 try
12 {
13 //Create save options with A4 size
14 System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
15
16 // Create new 1-paged PS Document
17 System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
18
19 float offsetX = 50.0f;
20 float offsetY = 100.0f;
21 float width = 200.0f;
22 float height = 100.0f;
23
24 ///////////////////////////////// Create rectangle with opaque gradient fill /////////////////////////////////////////////////////////
25 System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
26 path->AddRectangle(System::Drawing::RectangleF(offsetX, offsetY, width, height));
27
28 System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> opaqueBrush = System::MakeObject<System::Drawing::Drawing2D::LinearGradientBrush>(System::Drawing::RectangleF(0.0f, 0.0f, 200.0f, 100.0f), System::Drawing::Color::FromArgb(0, 0, 0), System::Drawing::Color::FromArgb(40, 128, 70), 0.f);
29 System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
30 opaqueBrush->set_Transform(brushTransform);
31 System::SharedPtr<GradientBrush> gradientBrush = System::MakeObject<GradientBrush>(opaqueBrush);
32 gradientBrush->set_WrapMode(System::Drawing::Drawing2D::WrapMode::Clamp);
33
34 document->SetPaint(gradientBrush);
35 document->Fill(path);
36 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
37
38 offsetX = 350.0f;
39
40 ///////////////////////////////// Create rectangle with translucent gradient fill ///////////////////////////////////////////////////
41 //Create graphics path from the first rectangle
42 path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
43 path->AddRectangle(System::Drawing::RectangleF(offsetX, offsetY, width, height));
44
45 //Create linear gradient brush colors which transparency are not 255, but 150 and 50. So it are translucent.
46 System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> translucentBrush = System::MakeObject<System::Drawing::Drawing2D::LinearGradientBrush>(System::Drawing::RectangleF(0.0f, 0.0f, width, height), System::Drawing::Color::FromArgb(150, 0, 0, 0), System::Drawing::Color::FromArgb(50, 40, 128, 70), 0.f);
47 //Create a transform for brush.
48 brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
49 //Set transform
50 translucentBrush->set_Transform(brushTransform);
51 //Create GradientBrush object containing the linear gradient brush
52 gradientBrush = System::MakeObject<GradientBrush>(translucentBrush);
53 gradientBrush->set_WrapMode(System::Drawing::Drawing2D::WrapMode::Clamp);
54 //Set paint
55 document->SetPaint(gradientBrush);
56 //Fill the rectangle
57 document->Fill(path);
58 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
59
60 //Close current page
61 document->ClosePage();
62
63 //Save the document
64 document->Save();
65 }
66 catch(...)
67 {
68 __dispose_guard_0.SetCurrentException(std::current_exception());
69 }
70 }
Результат запуска этого кода выглядит так:
Вы можете загрузить примеры и файлы данных с сайта GitHub.