Trabajar con transparencia en PostScript | C++

Agregar transparencia en el documento PS

PostScript no admite la transparencia al pintar objetos de gráficos vectoriales. Sin embargo, las imágenes translúcidas (parcialmente transparentes) se pueden representar como un conjunto de píxeles totalmente transparentes y totalmente opacos. Estas imágenes se denominan máscaras.

La biblioteca Aspose.Page para C++ ofrece un método que agrega la imagen transparente al documento PS. En cuanto a pintar gráficos vectoriales: formas o texto, ofrecemos “pseudotransparencia”.

La “pseudotransparencia” es un proceso de palidez de colores que tienen un componente Alfa inferior a 255. Se logra mediante la combinación específica de componentes Rojo, Verde y Azul con Alfa uno.

La “pseudotransparencia”, por supuesto, no nos permite ver la capa inferior de color debajo de la capa transparente superior, pero crea una ilusión de transparencia si la capa inferior es blanca.

Agregar imagen transparente en documento PS

Como escribimos anteriormente, las imágenes transparentes se pueden agregar al documento PS como una máscara y la biblioteca Aspose.Page para C++ ofrece para este propósito un método AddTransparentImage(). Este método reconoce si la imagen es completamente opaca o completamente transparente o translúcida. Si es completamente opaco, se agrega como imagen opaca en el método AddImage(), si es completamente transparente no se agrega al documento en absoluto, si es la imagen translúcida, se agrega como una imagen PostScript. mascarilla.

En el siguiente ejemplo, demostramos la diferencia entre agregar una imagen transparente en un documento PS con AddImage() y AddTransparentImage(). Para ver la imagen blanca translúcida, configuramos el color de fondo de la página en no blanco.

Para agregar cualquier imagen a un nuevo PsDocument con la biblioteca Aspose.Page para C++ en este ejemplo, realizamos los siguientes pasos:

  1. Cree una secuencia de salida para el archivo PS resultante.
  2. Cree el objeto PsSaveOptions con opciones predeterminadas. Cambie el color de fondo si es necesario.
  3. Cree un PsDocument de 1 página con un flujo de salida ya creado y opciones para guardar.
  4. Cree un nuevo estado de gráficos.
  5. Cree Mapa de bits a partir del archivo de imagen.
  6. Crea la transformación necesaria para la imagen.
  7. Agregue la imagen a PsDocument como una imagen completamente opaca (usando el método AddImage()) si estamos seguros de que la imagen es opaca o agregue una como imagen transparente (usando el método AddTransparentImage()) si no estamos seguros de que la imagen sea opaca.
  8. Salga del estado de gráficos actual al nivel uno superior.
  9. Cierra la página.
  10. Guarde el documento.
 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    }

Ver cómo trabajar con transparencia en un documento PS en .NET o Java.

El resultado de ejecutar este código es el siguiente.

Agregar imagen transparente

Agregar un objeto de gráficos vectoriales transparentes

Anteriormente escribimos que la biblioteca Aspose.Page para C++ utiliza un algoritmo de palidez para formas y texto transparentes, al que llamamos “pseudotransparencia”. En el siguiente ejemplo demostramos una diferencia entre dos formas pintadas con el mismo color, pero en la primera forma sin el componente Alfa y en el segundo caso con el componente Alfa.

 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    }

Vea cómo trabajar con transparencia en documentos PS en .NET o Java.

El resultado de ejecutar este código aparece como

Mostrar pseudotransparencia

Puede descargar ejemplos y archivos de datos desde GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.