Arbeiten mit Farbverläufen in PostScript | C++

Fügen Sie einen Farbverlauf im PS-Dokument hinzu

In diesem Artikel betrachten wir die Möglichkeiten, wie ein Farbverlauf in PS-Dokumenten verwendet werden kann.

Der Farbverlauf ist ein sanfter Übergang von einer Farbe zur anderen. Es wird verwendet, um die gezeichneten Bilder realistischer zu gestalten. Da Farbverlauf eine Art Farbe ist, wird er in C++ voraussichtlich als Unterklasse von System.Drawing.Brush implementiert. Tatsächlich verfügt die C++-Plattform über zwei solcher Pinsel:

Um Farbe oder einen Strich in PsDocument festzulegen, müssen wir ein Objekt der Klasse System.Drawing.Brush für ein Gemälde und ein Objekt der Klasse System.Drawing.Pen für den Strich übergeben jeweiligen Methoden. Die Aspose.Page for C++-Bibliothek verarbeitet alle Unterklassen von System.Drawing.Brush, die von der C++-Plattform angeboten werden. Dies sind System.Drawing.SolidBrush, System.Drawing.TextureBrush, System.Drawing.LinearGradientBrush, System.Drawing.PathGradientBrush und *System.Drawing.HatchBrush *. Die Klasse System.Drawing.Pen kann nicht erweitert werden, da sie versiegelt ist, aber sie enthält System.Drawing.Brush als Eigenschaft und daher kann die Bibliothek Aspose.Page für C++ auch einen vollständigen Satz von verwenden Pinsel auch zum Zeichnen von Linien und zum Umreißen von Formen und Text.

Um Grafikobjekte mit einem Farbverlauf in der Bibliothek Aspose.Page für C++ zu malen, ist es notwendig, System.Drawing.LinearGradientBrush oder System.Drawing.PathGradientBrush zu erstellen und an SetPaint( ) oder eine der Methoden FillText() oder FillAndStrokeText(), die System.Drawing.Brush als Parameter akzeptieren.

Um Grafikobjekte mit einem Farbverlauf in der Aspose.Page für C++-Bibliothek zu umreißen, sollte jemand System.Drawing.LinearGradientBrush oder System.Drawing.PathGradientBrush erstellen und dann **System.Drawing.Pen erstellen ** mit diesem Pinsel und übergeben Sie ihn schließlich an SetStroke() oder eine der Methoden OutlineText() oder FillAndStrokeText(), die System.Drawing.Pen akzeptiert. als Parameter.

Im folgenden Beispiel zeigen wir, wie man eine Form und einen Text füllt und den Text mit einem Farbverlauf umrandet.

Ein Algorithmus zum Malen von Grafikobjekten mit einem Farbverlauf in einem neuen PS-Dokument umfasst die folgenden Schritte:

  1. Erstellen Sie einen Ausgabestream für die resultierende PS-Datei.
  2. Erstellen Sie PsSaveOptions.
  3. Erstellen Sie PsDocument mit dem bereits erstellten Ausgabestream und den Speicheroptionen.
  4. Erstellen Sie den erforderlichen Grafikpfad oder die erforderliche Schriftart, abhängig davon, welches Objekt wir füllen oder umreißen möchten.
  5. Erstellen Sie ein Objekt von System.Drawing.LinearGradientBrush oder System.Drawing.PathGradientBrush in Abhängigkeit von der gewünschten Form eines Farbverlaufs.
  6. Stellen Sie an diesem Pinsel die erforderliche Transformation ein.
  7. Legen Sie den Verlaufspinsel als aktuelle Farbe in PsDocument fest
  8. Füllen Sie den Grafikpfad mit der aktuellen Farbe oder füllen Sie einen Text. Wenn wir eine der Methoden zum Füllen des Textes verwenden, die System.Drawing.Brush als Parameter akzeptiert, kann der vorherige Punkt ignoriert werden.
  9. Schließen Sie die Seite.
  10. Speichern Sie das Dokument.

Wenn wir Grafikobjekte streichen (umreißen) mit einem Farbverlauf anstelle der letzten 4 Punkte benötigen, ist Folgendes:8. Erstellen Sie das Objekt System.Drawing.Pen mit dem Verlaufspinsel.

  1. Legen Sie diesen Stift als aktuellen Strich in PsDocument fest.

  2. Umreißen Sie den Grafikpfad mit dem aktuellen Strich oder umreißen Sie den Text. Wenn wir eine der Methoden zum Umreißen des Textes verwenden, die System.Drawing.Pen als Parameter akzeptiert, kann der vorherige Punkt ignoriert werden.

  3. Schließen Sie die Seite.

  4. Speichern Sie das Dokument.

Wir bieten 5 Codeausschnitte an, die die Verwendung verschiedener Farbverläufe demonstrieren.

In diesem Codeausschnitt erstellen wir einen horizontalen linearen Farbverlauf aus zwei Farben, füllen ein Rechteck, füllen einen Text und umreißen einen Text mit diesem Farbverlauf.

 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    }

Das Ergebnis der Ausführung dieses Codes wird wie folgt angezeigt:

Horizontalen Farbverlauf hinzufügen

In diesem Codeausschnitt erstellen wir einen vertikalen linearen Farbverlauf aus 5 Farben und füllen ein Rechteck mit diesem Farbverlauf.

 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    }

Hier kommt das Ergebnis:

Vertikalen Farbverlauf hinzufügen

In diesem Codeausschnitt erstellen wir einen diagonalen linearen Farbverlauf aus 2 Farben und füllen ein Rechteck mit diesem Farbverlauf.

 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    }

Hier kommt das Ergebnis:

Diagonalen Farbverlauf hinzufügen

In diesem Codeausschnitt erstellen wir einen radialen Farbverlauf aus 2 Farben und füllen einen Kreis mit diesem Farbverlauf.

 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}

Das Ergebnis

Bild mit radialem Farbverlauf hinzufügen1

In diesem Codeausschnitt erstellen wir einen radialen Farbverlauf aus 6 Farben und füllen ein Rechteck mit diesem Farbverlauf.

 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}

Das Ergebnis

Radiales Farbverlaufsbild hinzufügen2

Weitere Informationen finden Sie unter „Arbeiten mit Farbverläufen in PS-Dokumenten“ in .NET oder Java.

Sie können Beispiele und Datendateien herunterladen von GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.