Робота з прозорістю в PostScript | C++

Додайте прозорість у документ PS

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

Бібліотека Aspose.Page для C++ пропонує метод, який додає прозоре зображення до документа PS. Що стосується малювання векторної графіки: форм або тексту, ми пропонуємо “псевдопрозорість”.

“Псевдопрозорість” – це процес блідості кольорів, які мають альфа-компонент менше 255. Його досягають спеціальним змішуванням червоного, зеленого та синього компонентів з альфа-1.

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

Додайте прозоре зображення в документ PS

Як ми вже писали раніше, прозорі зображення можна додавати до документа PS як маску, а бібліотека Aspose.Page для C++ пропонує для цього метод AddTransparentImage(). Цей метод визначає, чи є зображення повністю непрозорим, повністю прозорим чи напівпрозорим. Якщо воно повністю непрозоре, воно додається як непрозоре зображення в методі AddImage(), якщо воно повністю прозоре, воно не додається до документа взагалі, якщо це напівпрозоре зображення, воно додається як зображення PostScript маска.

У прикладі нижче ми демонструємо різницю між додаванням прозорого зображення в документ PS за допомогою AddImage() і AddTransparentImage(). Щоб побачити біле напівпрозоре зображення, ми встановлюємо небілий колір тла сторінки.

Щоб додати будь-яке зображення до нового PsDocument за допомогою бібліотеки Aspose.Page для C++ у цьому прикладі, ми виконуємо такі дії:

  1. Створіть вихідний потік для отриманого файлу PS.
  2. Створіть об’єкт PsSaveOptions із параметрами за замовчуванням. Змініть колір фону, якщо це потрібно.
  3. Створіть 1-сторінковий PsDocument із уже створеним вихідним потоком і параметрами збереження.
  4. Створіть новий графічний стан.
  5. Створіть Растрове зображення з файлу зображення.
  6. Створіть необхідну трансформацію для зображення.
  7. Додайте зображення до PsDocument як повністю непрозоре (за допомогою методу AddImage()), якщо ми впевнені, що зображення непрозоре, або додайте його як прозоре зображення (за допомогою методу AddTransparentImage()) якщо ми не впевнені, що зображення непрозоре.
  8. Вихід із поточного стану графіки на верхній рівень.
  9. Закрийте сторінку.
  10. Збережіть документ.
 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    }

Див. роботу з прозорістю в документі PS у .NET або [Java](/page/{{lang.url- фрагмент}}java/ps/working-with-transparency/).

Результат виконання цього коду наступний

Додати прозоре зображення

Додавання прозорого векторного графічного об’єкта

Раніше ми писали, що бібліотека Aspose.Page для C++ використовує алгоритм прозорості для прозорих форм і тексту, який ми назвали “псевдопрозорістю”. У наведеному нижче прикладі ми демонструємо різницю між двома фігурами, пофарбованими однаковим кольором, але в першій формі без компонента Alpha, а в другому випадку з компонентом Alpha.

 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    }

Див. роботу з прозорістю в документах PS у .NET або [Java](/page/{{lang.url- фрагмент}}java/ps/working-with-transparency/).

Результат виконання цього коду виглядає як

Показати псевдопрозорість

Ви можете завантажити приклади та файли даних із GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.