Trabajar con degradado en PostScript | C++

Agregar degradado en documento PS

En este artículo, consideramos las formas en que se puede utilizar un degradado en documentos PS.

El degradado es una transición suave de un color a otro. Se utiliza para hacer que los dibujos dibujados sean más realistas. Como el degradado es un tipo de pintura, se espera que en C++ se implemente como una subclase de System.Drawing.Brush. En realidad, la plataforma C++ tiene dos pinceles de este tipo:

Para configurar la pintura o un trazo en PsDocument debemos pasar un objeto de la clase System.Drawing.Brush para una pintura y un objeto de System.Drawing.Pen para aplicar un trazo. métodos respectivos. La biblioteca Aspose.Page para C++ procesa todas las subclases de System.Drawing.Brush que ofrece la plataforma C++. Estos son System.Drawing.SolidBrush, System.Drawing.TextureBrush, System.Drawing.LinearGradientBrush, System.Drawing.PathGradientBrush y *System.Drawing.HatchBrush *. La clase System.Drawing.Pen no se puede ampliar porque está sellada, pero contiene System.Drawing.Brush como propiedad y, por lo tanto, la biblioteca Aspose.Page para C++ también puede usar un conjunto completo de Pinceles también para dibujar líneas y delinear formas y texto.

Para pintar objetos gráficos con un degradado en la biblioteca Aspose.Page para C++ es necesario crear System.Drawing.LinearGradientBrush o System.Drawing.PathGradientBrush y pasarlo a SetPaint( ) o uno de los métodos FillText() o FillAndStrokeText() que aceptan System.Drawing.Brush como parámetro.

Para delinear objetos gráficos con un degradado en Aspose.Page para la biblioteca C++, alguien debe crear System.Drawing.LinearGradientBrush o System.Drawing.PathGradientBrush, luego crear **System.Drawing.Pen ** con este pincel y, finalmente, pásalo a SetStroke() o a uno de los métodos OutlineText() o FillAndStrokeText() que acepte System.Drawing.Pen como parámetro.

En el siguiente ejemplo, demostramos cómo rellenar una forma y un texto y delinear el texto con un degradado.

Un algoritmo para pintar objetos gráficos con un degradado en un nuevo documento PS incluye los siguientes pasos:

  1. Cree una secuencia de salida para el archivo PS resultante.
  2. Cree PsSaveOptions.
  3. Cree PsDocument con el flujo de salida ya creado y guarde las opciones.
  4. Cree la ruta gráfica o la fuente necesaria según el objeto que vayamos a rellenar o delinear.
  5. Cree un objeto de System.Drawing.LinearGradientBrush o System.Drawing.PathGradientBrush dependiendo de la forma deseada de un degradado.
  6. Establezca la transformación necesaria en este pincel.
  7. Establezca el pincel de degradado como pintura actual en PsDocument.
  8. Rellene la ruta de los gráficos con la pintura actual o rellene un texto. Si utilizamos uno de los métodos para rellenar el texto que acepta System.Drawing.Brush como parámetro, se puede ignorar el punto anterior.
  9. Cierra la página.
  10. Guarde el documento.

Si necesitamos trazar (delinear) objetos gráficos con un degradado en lugar de los últimos 4 puntos, lo siguiente será:8. Cree el objeto System.Drawing.Pen con el pincel de degradado.

  1. Establezca este lápiz como trazo actual en PsDocument.

  2. Delinee la ruta de los gráficos con el trazo actual o delinee el texto. Si utilizamos uno de los métodos para delinear el texto que acepta System.Drawing.Pen como parámetro, se puede ignorar el punto anterior.

  3. Cierra la página.

  4. Guarde el documento.

Ofrecemos 5 fragmentos de código que demuestran el uso de diferentes gradientes.

En este fragmento de código creamos un degradado lineal horizontal a partir de dos colores, rellenamos un rectángulo, rellenamos un texto y delineamos un texto con este degradado.

 1    // The path to the documents directory.
 2    System::String dataDir = RunExamples::GetDataDir_WorkingWithGradient();
 3    
 4    //Create output stream for PostScript document
 5    {
 6        System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"HorizontalGradient_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 = 200.0f;
20            float offsetY = 100.0f;
21            float width = 200.0f;
22            float height = 100.0f;
23            
24            //Create graphics path from the first rectangle
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            //Create linear gradient brush with rectangle as a bounds, start and end colors
29            System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> brush = 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);
30            //Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
31            //Translation components are offsets of the rectangle
32            System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
33            //Set transform
34            brush->set_Transform(brushTransform);
35            
36            //Set paint
37            document->SetPaint(brush);
38            
39            //Fill the rectangle
40            document->Fill(path);
41            
42            //Fill text with gradient
43            System::SharedPtr<System::Drawing::Font> font = System::MakeObject<System::Drawing::Font>(u"Arial", 96.0f, System::Drawing::FontStyle::Bold);
44            document->FillAndStrokeText(u"ABC", font, 200.0f, 300.0f, brush, System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Black()), 2.0f));
45            
46            //Set current stroke
47            document->SetStroke(System::MakeObject<System::Drawing::Pen>(brush, 5.0f));
48            //Outline text with gradient
49            document->OutlineText(u"ABC", font, 200.0f, 400.0f);
50            
51            //Close current page
52            document->ClosePage();
53            
54            //Save the document
55            document->Save();
56        }
57        catch(...)
58        {
59            __dispose_guard_0.SetCurrentException(std::current_exception());
60        }
61    }

El resultado de ejecutar este código aparece como

Agregar degradado horizontal

En este fragmento de código creamos un degradado lineal vertical a partir de 5 colores y rellenamos un rectángulo con este degradado.

 1    // The path to the documents directory.
 2    System::String dataDir = RunExamples::GetDataDir_WorkingWithGradient();
 3    
 4    //Create output stream for PostScript document
 5    {
 6        System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"VerticalGradient_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 = 200.0f;
20            float offsetY = 100.0f;
21            float width = 200.0f;
22            float height = 100.0f;
23            
24            //Create graphics path from the first rectangle
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            //Create an array of interpolation colors
29            System::ArrayPtr<System::Drawing::Color> colors = System::MakeArray<System::Drawing::Color>({System::Drawing::Color::get_Red(), System::Drawing::Color::get_Green(), System::Drawing::Color::get_Blue(), System::Drawing::Color::get_Orange(), System::Drawing::Color::get_DarkOliveGreen()});
30            System::ArrayPtr<float> positions = System::MakeArray<float>({0.0f, 0.1873f, 0.492f, 0.734f, 1.0f});
31            System::SharedPtr<System::Drawing::Drawing2D::ColorBlend> colorBlend = System::MakeObject<System::Drawing::Drawing2D::ColorBlend>();
32            colorBlend->set_Colors(colors);
33            colorBlend->set_Positions(positions);
34            
35            //Create linear gradient brush with rectangle as a bounds, start and end colors
36            System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> brush = System::MakeObject<System::Drawing::Drawing2D::LinearGradientBrush>(System::Drawing::RectangleF(0.0f, 0.0f, width, height), System::Drawing::Color::get_Beige(), System::Drawing::Color::get_DodgerBlue(), 0.f);
37            //Set interpolation colors
38            brush->set_InterpolationColors(colorBlend);
39            //Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
40            //Translation components are offsets of the rectangle
41            System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
42            //Rotate transform to get colors change in vertical direction from up to down
43            brushTransform->Rotate(90.0f);
44            //Set transform
45            brush->set_Transform(brushTransform);
46            
47            //Set paint
48            document->SetPaint(brush);
49            
50            //Fill the rectangle
51            document->Fill(path);
52            
53            //Close current page
54            document->ClosePage();
55            
56            //Save the document
57            document->Save();
58        }
59        catch(...)
60        {
61            __dispose_guard_0.SetCurrentException(std::current_exception());
62        }
63    }

Aquí viene el resultado:

Agregar degradado vertical

En este fragmento de código creamos un degradado lineal diagonal a partir de 2 colores y rellenamos un rectángulo con este degradado.

 1    // The path to the documents directory.
 2    System::String dataDir = RunExamples::GetDataDir_WorkingWithGradient();
 3    
 4    //Create output stream for PostScript document
 5    {
 6        System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"DiagonaGradient_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 = 200.0f;
20            float offsetY = 100.0f;
21            float width = 200.0f;
22            float height = 100.0f;
23            
24            //Create graphics path from the first rectangle
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            //Create linear gradient brush with rectangle as a bounds, start and end colors
29            System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> brush = System::MakeObject<System::Drawing::Drawing2D::LinearGradientBrush>(System::Drawing::RectangleF(0.0f, 0.0f, width, height), System::Drawing::Color::FromArgb(255, 255, 0, 0), System::Drawing::Color::FromArgb(255, 0, 0, 255), 0.f);
30            
31            //Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
32            //Translation components are offsets of the rectangle                
33            System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
34            //Rotate gradient, than scale and translate to get visible color transition in required rectangle
35            brushTransform->Rotate(-45.0f);
36            float hypotenuse = (float)System::Math::Sqrt(200 * 200 + 100 * 100);
37            float ratio = hypotenuse / 200;
38            brushTransform->Scale(-ratio, 1.0f);
39            brushTransform->Translate(100 / brushTransform->get_Elements()[0], 0.0f);
40            
41            //Set transform
42            brush->set_Transform(brushTransform);
43            
44            //Set paint
45            document->SetPaint(brush);
46            
47            //Fill the rectangle
48            document->Fill(path);
49            
50            //Close current page
51            document->ClosePage();
52            
53            //Save the document
54            document->Save();
55        }
56        catch(...)
57        {
58            __dispose_guard_0.SetCurrentException(std::current_exception());
59        }
60    }

Aquí viene el resultado:

Agregar degradado diagonal

En este fragmento de código creamos un degradado radial a partir de 2 colores y rellenamos un círculo con este degradado.

 1    // The path to the documents directory.
 2    System::String dataDir = RunExamples::GetDataDir_WorkingWithGradient();
 3    
 4    //Create output stream for PostScript document
 5    {
 6        System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"RadialGradient1_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 = 200.0f;
20            float offsetY = 100.0f;
21            float width = 200.0f;
22            float height = 200.0f;
23            
24            //Create graphics path from the rectangle bounds
25            System::Drawing::RectangleF bounds(offsetX, offsetY, width, height);
26            System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
27            path->AddEllipse(bounds);
28            
29            //Create and fill color blend object
30            System::ArrayPtr<System::Drawing::Color> colors = System::MakeArray<System::Drawing::Color>({System::Drawing::Color::get_White(), System::Drawing::Color::get_White(), System::Drawing::Color::get_Blue()});
31            System::ArrayPtr<float> positions = System::MakeArray<float>({0.0f, 0.2f, 1.0f});
32            System::SharedPtr<System::Drawing::Drawing2D::ColorBlend> colorBlend = System::MakeObject<System::Drawing::Drawing2D::ColorBlend>();
33            colorBlend->set_Colors(colors);
34            colorBlend->set_Positions(positions);
35            
36            System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> brushRect = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
37            brushRect->AddRectangle(System::Drawing::RectangleF(0.0f, 0.0f, width, height));
38            
39            //Create path gradient brush with rectangle as a bounds
40            System::SharedPtr<System::Drawing::Drawing2D::PathGradientBrush> brush = System::MakeObject<System::Drawing::Drawing2D::PathGradientBrush>(brushRect);
41            //Set interpolation colors
42            brush->set_InterpolationColors(colorBlend);
43            //Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
44            //Translation components are offsets of the rectangle
45            System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
46            //Set transform
47            brush->set_Transform(brushTransform);
48            
49            //Set paint
50            document->SetPaint(brush);
51            
52            //Fill the rectangle
53            document->Fill(path);
54            
55            //Close current page
56            document->ClosePage();
57            
58            //Save the document
59            document->Save();
60        }
61        catch(...)
62        {
63            __dispose_guard_0.SetCurrentException(std::current_exception());
64        }
65    }
66}

el resultado

Agregar imagen de degradado radial1

En este fragmento de código creamos un degradado radial a partir de 6 colores y rellenamos un rectángulo con este degradado.

 1    // The path to the documents directory.
 2    System::String dataDir = RunExamples::GetDataDir_WorkingWithGradient();
 3    
 4    //Create output stream for PostScript document
 5    {
 6        System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"RadialGradient2_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 = 200.0f;
20            float offsetY = 100.0f;
21            float width = 200.0f;
22            float height = 200.0f;
23            
24            //Create graphics path from the rectangle bounds
25            System::Drawing::RectangleF bounds(offsetX, offsetY, width, height);
26            System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
27            path->AddRectangle(bounds);
28            
29            //Create and fill color blend object
30            System::ArrayPtr<System::Drawing::Color> colors = System::MakeArray<System::Drawing::Color>({System::Drawing::Color::get_Green(), System::Drawing::Color::get_Blue(), System::Drawing::Color::get_Black(), System::Drawing::Color::get_Yellow(), System::Drawing::Color::get_Beige(), System::Drawing::Color::get_Red()});
31            System::ArrayPtr<float> positions = System::MakeArray<float>({0.0f, 0.2f, 0.3f, 0.4f, 0.9f, 1.0f});
32            System::SharedPtr<System::Drawing::Drawing2D::ColorBlend> colorBlend = System::MakeObject<System::Drawing::Drawing2D::ColorBlend>();
33            colorBlend->set_Colors(colors);
34            colorBlend->set_Positions(positions);
35            
36            System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> brushRect = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
37            brushRect->AddRectangle(System::Drawing::RectangleF(0.0f, 0.0f, width, height));
38            
39            //Create path gradient brush with rectangle as a bounds
40            System::SharedPtr<System::Drawing::Drawing2D::PathGradientBrush> brush = System::MakeObject<System::Drawing::Drawing2D::PathGradientBrush>(brushRect);
41            //Set interpolation colors
42            brush->set_InterpolationColors(colorBlend);
43            //Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
44            //Translation components are offsets of the rectangle
45            System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
46            //Set transform
47            brush->set_Transform(brushTransform);
48            
49            //Set paint
50            document->SetPaint(brush);
51            
52            //Fill the rectangle
53            document->Fill(path);
54            
55            //Close current page
56            document->ClosePage();
57            
58            //Save the document
59            document->Save();
60        }
61        catch(...)
62        {
63            __dispose_guard_0.SetCurrentException(std::current_exception());
64        }
65    }
66}

el resultado

Agregar imagen de degradado radial2

Consulte cómo trabajar con degradados en documentos PS en .NET o Java.

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.