Lavorare con le sfumature in PostScript | .NET
Aggiungere una sfumatura in un documento PS
In questo articolo, consideriamo i modi in cui una sfumatura può essere utilizzata nei documenti PS.
La sfumatura è una transizione graduale da un colore all’altro. Viene utilizzata per rendere le immagini disegnate più realistiche. Poiché la sfumatura è un tipo di pittura, è prevedibile che in .NET sia implementata come sottoclasse di System.Drawing.Brush. In realtà, la piattaforma .NET dispone di due pennelli di questo tipo:
- System.Drawing.LinearGradientBrush
- System.Drawing.PathGradientBrush
Per impostare una pittura o un tratto in PsDocument, dobbiamo passare un oggetto della classe System.Drawing.Brush per un dipinto e un oggetto di System.Drawing.Pen per il tratto ai rispettivi metodi. La libreria Aspose.Page per .NET elabora tutte le sottoclassi di System.Drawing.Brush offerte dalla piattaforma .NET. Queste sono System.Drawing.SolidBrush, System.Drawing.TextureBrush, System.Drawing.LinearGradientBrush, System.Drawing.PathGradientBrush e System.Drawing.HatchBrush. La classe System.Drawing.Pen non può essere estesa perché è sealed, ma contiene System.Drawing.Brush come proprietà e, pertanto, la libreria Aspose.Page per .NET può utilizzare un set completo di pennelli anche per disegnare linee e delineare forme e testo.
Per dipingere oggetti grafici con un gradiente nella libreria Aspose.Page per .NET, è necessario creare System.Drawing.LinearGradientBrush o System.Drawing.PathGradientBrush e passarlo a SetPaint() o a uno dei metodi FillText() o FillAndStrokeText() che accettano System.Drawing.Brush come parametro.
Per delineare oggetti grafici con un gradiente nella libreria Aspose.Page per .NET, è necessario creare System.Drawing.LinearGradientBrush o System.Drawing.PathGradientBrush, quindi creare System.Drawing.Pen con questo pennello e, infine, passarlo a SetStroke() o a uno dei metodi OutlineText() o FillAndStrokeText() che accetta System.Drawing.Pen come parametro.
Nell’esempio seguente mostriamo come riempire una forma e un testo e come delineare il testo con una sfumatura.
Un algoritmo per dipingere oggetti grafici con una sfumatura in un nuovo documento PS include i seguenti passaggi:
- Creare un flusso di output per il file PS risultante.
- Creare PsSaveOptions.
- Creare PsDocument con il flusso di output già creato e le opzioni di salvataggio.
- Creare il percorso grafico o il font necessari in base all’oggetto che si desidera riempire o delineare.
- Creare un oggetto di System.Drawing.LinearGradientBrush o System.Drawing.PathGradientBrush in base alla forma desiderata della sfumatura. 6. Impostare la trasformazione necessaria su questo pennello.
- Impostare il pennello sfumato come tratto corrente in PsDocument.
- Riempire il tracciato grafico con il tratto corrente o riempire un testo. Se utilizziamo uno dei metodi per riempire il testo che accetta System.Drawing.Brush come parametro, il punto precedente può essere ignorato.
- Chiudere la pagina.
- Salvare il documento.
Se desideriamo contornare (contornare) gli oggetti grafici con un gradiente invece degli ultimi 4 punti, ecco cosa fare:
Creare l’oggetto System.Drawing.Pen con il pennello sfumato.
Impostare questa penna come tratto corrente in PsDocument.
Delineare il tracciato grafico con il tratto corrente o delineare il testo. Se utilizziamo uno dei metodi per delineare il testo che accetta System.Drawing.Pen come parametro, il punto precedente può essere ignorato.
Chiudere la pagina.
Salva il documento.
Offriamo 5 frammenti di codice che illustrano l’utilizzo di diversi gradienti.
In questo frammento di codice creiamo un gradiente lineare orizzontale da due colori, riempiamo un rettangolo, riempiamo un testo e tracciamo un contorno di testo con questo gradiente.
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}
Per Linux, macOS e altri sistemi operativi non Windows, offriamo l’utilizzo del nostro pacchetto Nuget Aspose.Page.Drawing. Utilizza il backend Aspose.Drawing invece della libreria di sistema System.Drawing.
Quindi, importate lo spazio dei nomi Aspose.Page.Drawing invece di quello System.Drawing. Nei frammenti di codice sopra e seguenti verrà utilizzato Aspose.Page.Drawing.RectangleF al posto di System.Drawing.RectangleF, Aspose.Page.Drawing.Drawing2D.GraphicsPath al posto di System.Drawing.Drawing2D.GraphicsPath e così via. I nostri esempi di codice su GitHub contengono tutte le sostituzioni necessarie.
Il risultato dell’esecuzione di questo codice appare come
In questo frammento di codice creiamo una sfumatura lineare verticale da 5 colori e riempiamo un rettangolo con questa sfumatura.
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}
Ecco il risultato!
In questo frammento di codice creiamo una sfumatura lineare diagonale da 2 colori e riempiamo un rettangolo con questa sfumatura.
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}
Ecco il risultato!
In questo frammento di codice creiamo una sfumatura radiale da 2 colori e riempiamo un cerchio con questa sfumatura.
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}
Il risultato
In questo frammento di codice creiamo una sfumatura radiale da 6 colori e riempiamo un rettangolo con questa sfumatura.
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}
Il risultato
Vedi come lavorare con il gradiente nei documenti PS in Java.
È possibile scaricare esempi e file di dati da GitHub.