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:

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:

  1. Criar um fluxo de saída para o ficheiro PS resultante.
  2. Criar PsSaveOptions.
  3. Criar PsDocument com o fluxo de saída já criado e as opções de guardar.
  4. Criar o caminho gráfico ou a fonte necessária, dependendo do objeto que iremos preencher ou contornar.
  5. Criar um objeto a partir de System.Drawing.LinearGradientBrush ou System.Drawing.PathGradientBrush, dependendo da forma desejada de um gradiente.
  6. Defina a transformação necessária neste pincel.
  7. Defina o pincel de gradiente como a pintura atual no PsDocument.
  8. 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.
  9. Feche a página.
  10. Guarde o documento.

Se precisarmos de traçar (contornar) objetos gráficos com um gradiente em vez dos últimos 4 pontos, o seguinte será:

  1. Crie o objeto System.Drawing.Pen com o pincel de gradiente.

  2. Defina esta caneta como o traço atual no PsDocument.

  3. 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.

  4. Feche a página.

  5. 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// Paint rectangle and text and draw text with horizontal gradient fill in PS document.
 2
 3string outputFileName = "HorizontalGradient_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7
 8// Create new 1-paged PS Document
 9PsDocument document = new PsDocument(OutputDir + outputFileName, options, false);
10
11float offsetX = 200;
12float offsetY = 100;
13float width = 200;
14float height = 100;
15
16//Create graphics path from the first rectangle
17GraphicsPath path = new GraphicsPath();
18path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
19
20//Create linear gradient brush with rectangle as a bounds, start and end colors
21LinearGradientBrush brush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.FromArgb(150, 0, 0, 0),
22    Color.FromArgb(50, 40, 128, 70), 0f);
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
25Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
26//Set transform
27brush.Transform = brushTransform;
28
29//Set paint
30document.SetPaint(brush);
31
32//Fill the rectangle
33document.Fill(path);
34
35//Fill text with gradient
36System.Drawing.Font font = new System.Drawing.Font("Arial", 96, FontStyle.Bold);
37document.FillAndStrokeText("ABC", font, 200, 300, brush, new Pen(new SolidBrush(Color.Black), 2));
38
39//Set current stroke
40document.SetStroke(new Pen(brush, 5));
41//Outline text with gradient
42document.OutlineText("ABC", font, 200, 400);
43
44//Close current page
45document.ClosePage();
46
47//Save the document
48document.Save();

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

Adicionar Gradiente Horizontal

Neste excerto de código, criamos um gradiente linear vertical com 5 cores e preenchemos um retângulo com esse gradiente.

 1// Paint rectangle with vertical gradient fill in PS document.
 2
 3string outputFileName = "VerticalGradient_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7
 8// Create new 1-paged PS Document
 9PsDocument document = new PsDocument(OutputDir + outputFileName, options, false);
10
11float offsetX = 200;
12float offsetY = 100;
13float width = 200;
14float height = 100;
15
16//Create graphics path from the first rectangle
17GraphicsPath path = new GraphicsPath();
18path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
19
20//Create an array of interpolation colors
21Color[] colors = { Color.Red, Color.Green, Color.Blue, Color.Orange, Color.DarkOliveGreen };
22float[] positions = { 0.0f, 0.1873f, 0.492f, 0.734f, 1.0f };
23ColorBlend colorBlend = new ColorBlend();
24colorBlend.Colors = colors;
25colorBlend.Positions = positions;
26
27//Create linear gradient brush with rectangle as a bounds, start and end colors
28LinearGradientBrush brush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.Beige, Color.DodgerBlue, 0f);
29//Set interpolation colors
30brush.InterpolationColors = colorBlend;
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
33Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
34//Rotate transform to get colors change in vertical direction from up to down
35brushTransform.Rotate(90);
36//Set transform
37brush.Transform = brushTransform;
38
39//Set paint
40document.SetPaint(brush);
41
42//Fill the rectangle
43document.Fill(path);
44
45//Close current page
46document.ClosePage();
47
48//Save the document
49document.Save();

Aí vem o resultado

Adicionar Gradiente Vertical

Neste trecho de código, criamos um gradiente linear diagonal a partir de 2 cores e preenchemos um retângulo com esse gradiente.

 1// Paint a circle with 2-colors radial gradient fill in PS document.
 2
 3string outputFileName = "RadialGradient1_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7
 8// Create new 1-paged PS Document
 9PsDocument document = new PsDocument(OutputDir + outputFileName, options, false);
10
11float offsetX = 200;
12float offsetY = 100;
13float width = 200;
14float height = 200;
15
16//Create graphics path from the rectangle bounds
17RectangleF bounds = new RectangleF(offsetX, offsetY, width, height);
18GraphicsPath path = new GraphicsPath();
19path.AddEllipse(bounds);
20
21//Create and fill color blend object
22Color[] colors = { Color.White, Color.White, Color.Blue };
23float[] positions = { 0.0f, 0.2f, 1.0f };
24ColorBlend colorBlend = new ColorBlend();
25colorBlend.Colors = colors;
26colorBlend.Positions = positions;
27
28GraphicsPath brushRect = new GraphicsPath();
29brushRect.AddRectangle(new RectangleF(0, 0, width, height));
30
31//Create path gradient brush with rectangle as a bounds
32PathGradientBrush brush = new PathGradientBrush(brushRect);
33//Set interpolation colors
34brush.InterpolationColors = colorBlend;
35//Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
36//Translation components are offsets of the rectangle
37Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
38//Set transform
39brush.Transform = brushTransform;
40
41//Set paint
42document.SetPaint(brush);
43
44//Fill the rectangle
45document.Fill(path);
46
47//Close current page
48document.ClosePage();
49
50//Save the document
51document.Save();
Aí vem o resultado

Adicionar Gradiente Diagonal

Neste trecho de código, criamos um gradiente radial a partir de 2 cores e preenchemos um círculo com esse gradiente.

 1// Paint a circle with 6-colors radial gradient fill in PS document.
 2
 3string outputFileName = "RadialGradient2_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7
 8// Create new 1-paged PS Document
 9PsDocument document = new PsDocument(OutputDir + outputFileName, options, false);
10
11float offsetX = 200;
12float offsetY = 100;
13float width = 200;
14float height = 200;
15
16//Create graphics path from the rectangle bounds
17RectangleF bounds = new RectangleF(offsetX, offsetY, width, height);
18GraphicsPath path = new GraphicsPath();
19path.AddRectangle(bounds);
20
21//Create and fill color blend object
22Color[] colors = { Color.Green, Color.Blue, Color.Black, Color.Yellow, Color.Beige, Color.Red };
23float[] positions = { 0.0f, 0.2f, 0.3f, 0.4f, 0.9f, 1.0f };
24ColorBlend colorBlend = new ColorBlend();
25colorBlend.Colors = colors;
26colorBlend.Positions = positions;
27
28GraphicsPath brushRect = new GraphicsPath();
29brushRect.AddRectangle(new RectangleF(0, 0, width, height));
30
31//Create path gradient brush with rectangle as a bounds
32PathGradientBrush brush = new PathGradientBrush(brushRect);
33//Set interpolation colors
34brush.InterpolationColors = colorBlend;
35//Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
36//Translation components are offsets of the rectangle
37Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
38//Set transform
39brush.Transform = brushTransform;
40
41//Set paint
42document.SetPaint(brush);
43
44//Fill the rectangle
45document.Fill(path);
46
47//Close current page
48document.ClosePage();
49
50//Save the document
51document.Save();

O resultado

Adicionar imagem de gradiente radial1

Neste trecho de código, criamos um gradiente radial a partir de 6 cores e preenchemos um retângulo com esse gradiente.

 1// Paint a circle with 2-colors radial gradient fill in PS document.
 2
 3string outputFileName = "RadialGradient1_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7
 8// Create new 1-paged PS Document
 9PsDocument document = new PsDocument(OutputDir + outputFileName, options, false);
10
11float offsetX = 200;
12float offsetY = 100;
13float width = 200;
14float height = 200;
15
16//Create graphics path from the rectangle bounds
17RectangleF bounds = new RectangleF(offsetX, offsetY, width, height);
18GraphicsPath path = new GraphicsPath();
19path.AddEllipse(bounds);
20
21//Create and fill color blend object
22Color[] colors = { Color.White, Color.White, Color.Blue };
23float[] positions = { 0.0f, 0.2f, 1.0f };
24ColorBlend colorBlend = new ColorBlend();
25colorBlend.Colors = colors;
26colorBlend.Positions = positions;
27
28GraphicsPath brushRect = new GraphicsPath();
29brushRect.AddRectangle(new RectangleF(0, 0, width, height));
30
31//Create path gradient brush with rectangle as a bounds
32PathGradientBrush brush = new PathGradientBrush(brushRect);
33//Set interpolation colors
34brush.InterpolationColors = colorBlend;
35//Create a transform for brush. X and Y scale component must be equal to width and height of the rectangle correspondingly.
36//Translation components are offsets of the rectangle
37Matrix brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
38//Set transform
39brush.Transform = brushTransform;
40
41//Set paint
42document.SetPaint(brush);
43
44//Fill the rectangle
45document.Fill(path);
46
47//Close current page
48document.ClosePage();
49
50//Save the document
51document.Save();

O resultado

Adicionar imagem de Gradiente Radial2

Veja como trabalhar com gradiente em documentos PS em Java.

Pode descarregar exemplos e ficheiros de dados do GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.