Trabalhar com Gradiente em PostScript | .NET
Adicionar Gradiente em Documento PS
Neste artigo, consideramos as formas como um gradiente pode ser utilizado em documentos de PS.
O gradiente é uma transição suave de uma cor para outra. É utilizado para tornar as imagens desenhadas mais realistas. Como o gradiente é um tipo de tinta, é esperado que em . NET seja implementado como uma subclasse de System.Drawing.Brush. Na verdade, a plataforma . NET possui dois destes pincéis:
- System.Drawing.LinearGradientBrush
- System.Drawing.PathGradientBrush
Para definir uma tinta ou um traço em PsDocument, devemos passar um objeto da classe System.Drawing.Brush para uma pintura e um objeto da classe System.Drawing.Pen para o traço nos respetivos métodos. A biblioteca Aspose.Page para .NET processa todas as subclasses de System.Drawing.Brush oferecidas pela plataforma .NET. São elas: System.Drawing.SolidBrush, System.Drawing.TextureBrush, System.Drawing.LinearGradientBrush, System.Drawing.PathGradientBrush e System.Drawing.HatchBrush. A classe System.Drawing.Pen não pode ser estendida porque está selada, mas contém System.Drawing.Brush como propriedade e, portanto, a biblioteca Aspose.Page para .NET também pode utilizar um conjunto completo de pincéis para desenhar linhas e contornar formas e texto.
Para pintar objetos gráficos com um gradiente na biblioteca Aspose.Page para .NET, é necessário criar System.Drawing.LinearGradientBrush ou System.Drawing.PathGradientBrush e passá-los para SetPaint() ou um dos métodos FillText() ou FillAndStrokeText() que aceitam System.Drawing.Brush como parâmetro.
Para contornar objetos gráficos com um gradiente na biblioteca Aspose.Page para .NET, é necessário criar System.Drawing.LinearGradientBrush ou System.Drawing.PathGradientBrush, depois criar System.Drawing.Pen com este pincel e, por fim, passá-lo para SetStroke() ou um dos métodos OutlineText() ou FillAndStrokeText() que aceitam System.Drawing.Pen como parâmetro.
No exemplo abaixo, demonstramos como preencher uma forma e um texto, bem como contorná-lo com um gradiente.
Um algoritmo para pintar objetos gráficos com um gradiente num novo documento PS inclui os seguintes passos:
- Criar um fluxo de saída para o ficheiro PS resultante.
- Criar PsSaveOptions.
- Criar PsDocument com o fluxo de saída já criado e as opções de guardar.
- Criar o caminho gráfico ou a fonte necessária, dependendo do objeto que iremos preencher ou contornar.
- Criar um objeto a partir de System.Drawing.LinearGradientBrush ou System.Drawing.PathGradientBrush, dependendo da forma desejada de um gradiente.
- Defina a transformação necessária neste pincel.
- Defina o pincel de gradiente como a pintura atual no PsDocument.
- Preencha o percurso gráfico com a pintura atual ou preencha um texto. Se utilizarmos um dos métodos de preenchimento de texto que aceita System.Drawing.Brush como parâmetro, o ponto anterior pode ser ignorado.
- Feche a página.
- Guarde o documento.
Se precisarmos de traçar (contornar) objetos gráficos com um gradiente em vez dos últimos 4 pontos, o seguinte será:
Crie o objeto System.Drawing.Pen com o pincel de gradiente.
Defina esta caneta como o traço atual no PsDocument.
Contorne o percurso gráfico com o traço atual ou contorne o texto. Se utilizarmos um dos métodos de contorno de texto que aceita System.Drawing.Pen como parâmetro, o ponto anterior pode ser ignorado.
Feche a página.
Guarde o documento.
Disponibilizamos 5 excertos de código que demonstram a utilização de diferentes gradientes.
Neste excerto de código, criamos um gradiente linear horizontal a partir de duas cores, preenchemos um retângulo, preenchemos um texto e contornamos um texto com este 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}
Para Linux, MacOS e outros sistemas operativos não Windows, oferecemos a utilização do nosso pacote NuGet Aspose.Page.Drawing. Utiliza o backend Aspose.Drawing em vez da biblioteca de sistema System.Drawing.
Assim, importe o namespace Aspose.Page.Drawing em vez do System.Drawing. Nos excertos de código acima e seguintes, será utilizado Aspose.Page.Drawing.RectangleF em vez de System.Drawing.RectangleF, Aspose.Page.Drawing.Drawing2D.GraphicsPath em vez de System.Drawing.Drawing2D.GraphicsPath e assim por diante. Os nossos exemplos de código no GitHub contêm todas as substituições necessárias.
O resultado da execução deste código é apresentado como
Neste excerto de código, criamos um gradiente linear vertical com 5 cores e preenchemos um retângulo com esse gradiente.
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}
Aí vem o resultado
Neste trecho de código, criamos um gradiente linear diagonal a partir de 2 cores e preenchemos um retângulo com esse gradiente.
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}
Aí vem o resultado
Neste trecho de código, criamos um gradiente radial a partir de 2 cores e preenchemos um círculo com esse gradiente.
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}
O resultado
Neste trecho de código, criamos um gradiente radial a partir de 6 cores e preenchemos um retângulo com esse gradiente.
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}
O resultado
Veja como trabalhar com gradiente em documentos PS em Java.
Pode descarregar exemplos e ficheiros de dados do GitHub.