Arbeiten mit Farbverläufen in PostScript | .NET
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 .NET voraussichtlich als Unterklasse von System.Drawing.Brush implementiert. Tatsächlich verfügt die .NET-Plattform über zwei solcher Pinsel:
- System.Drawing.LinearGradientBrush
- System.Drawing.PathGradientBrush
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 .NET-Bibliothek verarbeitet alle Unterklassen von System.Drawing.Brush, die von der .NET-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 .NET auch einen vollständigen Satz verwenden von Pinseln auch zum Zeichnen von Linien und zum Umreißen von Formen und Text.
Um Grafikobjekte mit einem Farbverlauf in der Aspose.Page für .NET-Bibliothek zu malen, ist es notwendig, System.Drawing.LinearGradientBrush oder System.Drawing.PathGradientBrush zu erstellen und an SetPaint zu übergeben () 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 .NET-Bibliothek zu umreißen, sollte jemand System.Drawing.LinearGradientBrush oder System.Drawing.PathGradientBrush erstellen und dann System.Drawing erstellen. Stift 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:
- Erstellen Sie einen Ausgabestream für die resultierende PS-Datei.
- Erstellen Sie PsSaveOptions.
- Erstellen Sie PsDocument mit dem bereits erstellten Ausgabestream und den Speicheroptionen.
- Erstellen Sie den erforderlichen Grafikpfad oder die erforderliche Schriftart, abhängig davon, welches Objekt wir füllen oder umreißen möchten.
- Erstellen Sie ein Objekt von System.Drawing.LinearGradientBrush oder System.Drawing.PathGradientBrush in Abhängigkeit von der gewünschten Form eines Farbverlaufs.
- Stellen Sie an diesem Pinsel die erforderliche Transformation ein.
- Legen Sie den Verlaufspinsel als aktuelle Farbe in PsDocument fest
- 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.
- Schließen Sie die Seite.
- 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.
Legen Sie diesen Stift als aktuellen Strich in PsDocument fest.
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.
Schließen Sie die Seite.
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//Create an output stream for PostScript document
2using (Stream outPsStream = new FileStream(dataDir + "HorizontalGradient_outPS.ps", FileMode.Create))
3{
4 //Create save options with A4 size
5 PsSaveOptions options = new PsSaveOptions();
6
7 // Create new 1-paged PS Document
8 PsDocument document = new PsDocument(outPsStream, options, false);
9
10 float offsetX = 200;
11 float offsetY = 100;
12 float width = 200;
13 float height = 100;
14
15 //Create a graphics path from the first rectangle
16 GraphicsPath path = new GraphicsPath();
17 path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
18
19 //Create linear gradient brush with the rectangle as bounds, start and end colors
20 LinearGradientBrush brush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.FromArgb(150, 0, 0, 0),
21 Color.FromArgb(50, 40, 128, 70), 0f);
22 //Create a transform for the brush. X and Y scale component must be equal to the width and the height of the rectangle respectively.
23 //Translation components are offsets of the rectangle
24 Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
25 //Set the transform
26 brush.Transform = brushTransform;
27
28 //Set the paint
29 document.SetPaint(brush);
30
31 //Fill the rectangle
32 document.Fill(path);
33
34 //Fill the text with the gradient
35 Font font = new Font("Arial", 96, FontStyle.Bold);
36 document.FillAndStrokeText("ABC", font, 200, 300, brush, new Pen(new SolidBrush(Color.Black), 2));
37
38 //Set current stroke
39 document.SetStroke(brush, 5);
40 //Outline text with the gradient
41 document.OutlineText("ABC", font, 200, 400);
42
43 //Close current page
44 document.ClosePage();
45
46 //Save the document
47 document.Save();
48}
Für Linux, MacOS und andere Nicht-Windows-Betriebssysteme bieten wir die Verwendung unseres Nuget-Pakets Aspose.Page.Drawing an. Es verwendet das Aspose.Drawing-Backend anstelle der System.Drawing-Systembibliothek.
Importieren Sie also den Namensraum Aspose.Page.Drawing anstelle des Namensraums System.Drawing. In den obigen und folgenden Codeausschnitten wird Aspose.Page.Drawing.RectangleF anstelle von System.Drawing.RectangleF, Aspose.Page.Drawing.Drawing2D.GraphicsPath anstelle von System.Drawing.Drawing2D.GraphicsPath usw. verwendet. Unsere Codebeispiele auf GitHub enthalten alle notwendigen Ersetzungen.
Das Ergebnis der Ausführung dieses Codes wird wie folgt angezeigt:
In diesem Codeausschnitt erstellen wir einen vertikalen linearen Farbverlauf aus 5 Farben und füllen ein Rechteck mit diesem Farbverlauf.
1//Create an output stream for PostScript document
2using (Stream outPsStream = new FileStream(dataDir + "VerticalGradient_outPS.ps", FileMode.Create))
3{
4 //Create save options with A4 size
5 PsSaveOptions options = new PsSaveOptions();
6
7 // Create new 1-paged PS Document
8 PsDocument document = new PsDocument(outPsStream, options, false);
9
10 float offsetX = 200;
11 float offsetY = 100;
12 float width = 200;
13 float height = 100;
14
15 //Create graphics path from the first rectangle
16 GraphicsPath path = new GraphicsPath();
17 path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
18
19 //Create an array of interpolation colors
20 Color[] colors = { Color.Red, Color.Green, Color.Blue, Color.Orange, Color.DarkOliveGreen };
21 float[] positions = { 0.0f, 0.1873f, 0.492f, 0.734f, 1.0f };
22 ColorBlend colorBlend = new ColorBlend();
23 colorBlend.Colors = colors;
24 colorBlend.Positions = positions;
25
26 //Create linear gradient brush with the rectangle as bounds, start and end colors
27 LinearGradientBrush brush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.Beige, Color.DodgerBlue, 0f);
28 //Set interpolation colors
29 brush.InterpolationColors = colorBlend;
30 //Create a transform for the 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 Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
33 //Rotate the graphics state to get colors change in vertical direction from up to down
34 brushTransform.Rotate(90);
35 //Set the transform
36 brush.Transform = brushTransform;
37
38 //Set the paint
39 document.SetPaint(brush);
40
41 //Fill the rectangle
42 document.Fill(path);
43
44 //Close current page
45 document.ClosePage();
46
47 //Save the document
48 document.Save();
49}
Hier kommt das Ergebnis
In diesem Codeausschnitt erstellen wir einen diagonalen linearen Farbverlauf aus 2 Farben und füllen ein Rechteck mit diesem Farbverlauf.
1//Create an output stream for PostScript document
2using (Stream outPsStream = new FileStream(dataDir + "DiagonaGradient_outPS.ps", FileMode.Create))
3{
4 //Create save options with A4 size
5 PsSaveOptions options = new PsSaveOptions();
6
7 // Create new 1-paged PS Document
8 PsDocument document = new PsDocument(outPsStream, options, false);
9
10 float offsetX = 200;
11 float offsetY = 100;
12 float width = 200;
13 float height = 100;
14
15 //Create a graphics path from the first rectangle
16 GraphicsPath path = new GraphicsPath();
17 path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
18
19 //Create linear gradient brush with the rectangle as bounds, start and end colors
20 LinearGradientBrush brush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.FromArgb(255, 255, 0, 0),
21 Color.FromArgb(255, 0, 0, 255), 0f);
22
23 //Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
24 //Translation components are offsets of the rectangle
25 Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
26 //Rotate the gradient, than scale and translate to get visible a color transition in required rectangle
27 brushTransform.Rotate(-45);
28 float hypotenuse = (float)System.Math.Sqrt(200 * 200 + 100 * 100);
29 float ratio = hypotenuse / 200;
30 brushTransform.Scale(-ratio, 1);
31 brushTransform.Translate(100 / brushTransform.Elements[0], 0);
32
33 //Set the transform
34 brush.Transform = brushTransform;
35
36 //Set the paint
37 document.SetPaint(brush);
38
39 //Fill the rectangle
40 document.Fill(path);
41
42 //Close current page
43 document.ClosePage();
44
45 //Save the document
46 document.Save();
47}
Hier kommt das Ergebnis
In diesem Codeausschnitt erstellen wir einen radialen Farbverlauf aus 2 Farben und füllen einen Kreis mit diesem Farbverlauf.
1//Create an output stream for PostScript document
2using (Stream outPsStream = new FileStream(dataDir + "RadialGradient1_outPS.ps", FileMode.Create))
3{
4 //Create save options with A4 size
5 PsSaveOptions options = new PsSaveOptions();
6
7 // Create new 1-paged PS Document
8 PsDocument document = new PsDocument(outPsStream, options, false);
9
10 float offsetX = 200;
11 float offsetY = 100;
12 float width = 200;
13 float height = 200;
14
15 //Create a graphics path from the rectangle bounds
16 RectangleF bounds = new RectangleF(offsetX, offsetY, width, height);
17 GraphicsPath path = new GraphicsPath();
18 path.AddEllipse(bounds);
19
20 //Create and fill color blend object
21 Color[] colors = { Color.White, Color.White, Color.Blue };
22 float[] positions = { 0.0f, 0.2f, 1.0f };
23 ColorBlend colorBlend = new ColorBlend();
24 colorBlend.Colors = colors;
25 colorBlend.Positions = positions;
26
27 GraphicsPath brushRect = new GraphicsPath();
28 brushRect.AddRectangle(new RectangleF(0, 0, width, height));
29
30 //Create path gradient brush with the rectangle as bounds
31 PathGradientBrush brush = new PathGradientBrush(brushRect);
32 //Set interpolation colors
33 brush.InterpolationColors = colorBlend;
34 //Create a transform for the brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
35 //Translation components are offsets of the rectangle
36 Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
37 //Set the transform
38 brush.Transform = brushTransform;
39
40 //Set the paint
41 document.SetPaint(brush);
42
43 //Fill the rectangle
44 document.Fill(path);
45
46 //Close current page
47 document.ClosePage();
48
49 //Save the document
50 document.Save();
51}
Das Ergebnis
In diesem Codeausschnitt erstellen wir einen radialen Farbverlauf aus 6 Farben und füllen ein Rechteck mit diesem Farbverlauf.
1//Create an output stream for PostScript document
2using (Stream outPsStream = new FileStream(dataDir + "RadialGradient2_outPS.ps", FileMode.Create))
3{
4 //Create save options with A4 size
5 PsSaveOptions options = new PsSaveOptions();
6
7 // Create new 1-paged PS Document
8 PsDocument document = new PsDocument(outPsStream, options, false);
9
10 float offsetX = 200;
11 float offsetY = 100;
12 float width = 200;
13 float height = 200;
14
15 //Create a graphics path from the rectangle bounds
16 RectangleF bounds = new RectangleF(offsetX, offsetY, width, height);
17 GraphicsPath path = new GraphicsPath();
18 path.AddRectangle(bounds);
19
20 //Create and fill color blend object
21 Color[] colors = { Color.Green, Color.Blue, Color.Black, Color.Yellow, Color.Beige, Color.Red };
22 float[] positions = { 0.0f, 0.2f, 0.3f, 0.4f, 0.9f, 1.0f };
23 ColorBlend colorBlend = new ColorBlend();
24 colorBlend.Colors = colors;
25 colorBlend.Positions = positions;
26
27 GraphicsPath brushRect = new GraphicsPath();
28 brushRect.AddRectangle(new RectangleF(0, 0, width, height));
29
30 //Create path gradient brush with the rectangle as bounds
31 PathGradientBrush brush = new PathGradientBrush(brushRect);
32 //Set interpolation colors
33 brush.InterpolationColors = colorBlend;
34 //Create a transform for the brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
35 //Translation components are offsets of the rectangle
36 Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
37 //Set the transform
38 brush.Transform = brushTransform;
39
40 //Set the paint
41 document.SetPaint(brush);
42
43 //Fill the rectangle
44 document.Fill(path);
45
46 //Close current page
47 document.ClosePage();
48
49 //Save the document
50 document.Save();
51}
Das Ergebnis
Weitere Informationen finden Sie unter „Arbeiten mit Farbverläufen in PS-Dokumenten“ in Java.
Sie können Beispiele und Datendateien herunterladen von GitHub.