Trabalhar com Gradiente em ficheiro PS | Java
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 Java seja implementado como uma subclasse de java.awt.Paint. Na verdade, a plataforma Java possui duas destas tintas:
- java.awt.LinearGradientPaint
- java.awt.RadialGradientPaint
Existe também java.awt.GradientPaint, mas é apenas um caso particular de java.awt.LinearGradientPaint.
Para definir uma pintura ou um traço em PsDocument, precisamos de passar um objeto da classe java.awt.Paint para uma pintura e um objeto da classe java.awt.Stroke para o traço nos respetivos métodos. A biblioteca Aspose.Page para Java processa todas as classes importantes implementadas em java.awt.Paint oferecidas pela plataforma Java. São elas: java.awt.Color, java.awt.TexturePaint, java.awt.LinearGradientPaint e java.awt.RadialGradientPaint. A cor do traço em Java é atribuída separadamente das propriedades do traço no objeto java.awt.Stroke, utilizando novamente java.awt.Paint. Por conseguinte, a biblioteca Aspose.Page para Java também pode utilizar um conjunto completo de implementações de pintura para desenhar linhas e delinear formas e texto.
Para pintar objetos gráficos com um gradiente na biblioteca Aspose.Page para Java, é necessário criar java.awt.LinearGradientPaint ou java.awt.RadialGradientPaint e passá-los para setPaint() ou um dos métodos fillText() ou fillAndStrokeText() que aceitam java.awt.Paint como parâmetro.
Para contornar os objetos gráficos com um gradiente na biblioteca Aspose.Page para Java, é necessário passar java.awt.LinearGradientPaint ou java.awt.RadialGradientPaint também para setPaint() ou um dos métodos outlineText() ou fillAndStrokeText() que aceitam pintura de traços como parâmetro.
No exemplo abaixo, demonstramos como preencher uma forma e um texto e contornar o texto com um gradiente.
Um algoritmo para pintar objetos gráficos com um gradiente num novo documento PS inclui os seguintes passos:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie PsSaveOptions.
- Crie PsDocument com o fluxo de saída já criado e as opções de guardar.
- Crie o caminho gráfico ou a fonte necessária, dependendo do objeto que iremos preencher ou contornar.
- Crie um objeto a partir de java.awt.LinearGradientPaint ou java.awt.RadialGradientPaint, dependendo da forma desejada do 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 java.awt.Paint 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á:
- Defina o gradiente como a pintura atual no PsDocument.
- Crie o objeto java.awt.Stroke.
- Defina este traço 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 java.awt.Stroke como parâmetro, o ponto anterior pode ser ignorado.
- Feche a página.
- Guarde o documento.
Oferecemos 5 excertos de código separados 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
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "HorizontalGradient_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Create a rectangle
10Rectangle2D.Float rectangle = new Rectangle2D.Float(200, 100, 200, 100);
11
12//Create horizontal linear gradient paint. Scale components in the transform must be equal to width and heigh of the rectangle.
13//Translation components are offsets of the rectangle.
14LinearGradientPaint paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
15 new float [] {0, 1}, new Color [] {new Color(0, 0, 0, 150), new Color(40, 128, 70, 50)},
16 MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
17 new AffineTransform(200, 0, 0, 100, 200, 100));
18
19//Set paint
20document.setPaint(paint);
21//Fill the rectangle
22document.fill(rectangle);
23
24//Fill a text with the gradient
25Font font = new Font("Arial", Font.BOLD, 96);
26document.fillAndStrokeText("ABC", font, 200, 300, paint, Color.BLACK, new BasicStroke(2));
27
28//Stroke a text with the gradient
29document.outlineText("ABC", font, 200, 400, paint, new BasicStroke(5));
30
31//Close current page
32document.closePage();
33//Save the document
34document.save();
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
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "VerticalGradient_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Create a rectangle
10Rectangle2D.Float rectangle = new Rectangle2D.Float(200, 100, 200, 100);
11
12//Create arrays of colors and fractions for the gradient.
13Color[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.ORANGE, new Color(85,107,47) };
14float[] fractions = { 0.0f, 0.1873f, 0.492f, 0.734f, 1.0f };
15
16//Create the gradient transform. Scale components in the transform must be equal to width and heigh of the rectangle.
17//Translation components are offsets of the rectangle.
18AffineTransform transform = new AffineTransform(200, 0, 0, 100, 200, 100);
19//Rotate the gradient on 90 degrees around an origin
20transform.rotate(90 * (Math.PI / 180));
21
22//Create vertical linear gradient paint.
23LinearGradientPaint paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
24 fractions, colors, MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
25 transform);
26
27//Set paint
28document.setPaint(paint);
29//Fill the rectangle
30document.fill(rectangle);
31
32//Close current page
33document.closePage();
34//Save the document
35document.save();
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
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "DiagonalGradient_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6// Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Create a rectangle
10Rectangle2D.Float rectangle = new Rectangle2D.Float(200, 100, 200, 100);
11
12//Create the gradient transform. Scale components in the transform must be equal to width and heigh of the rectangle.
13//Translation components are offsets of the rectangle.
14AffineTransform transform = new AffineTransform(200, 0, 0, 100, 200, 100);
15//Rotate gradient, than scale and translate to get visible color transition in required rectangle
16transform.rotate(-45 * (Math.PI / 180));
17float hypotenuse = (float) Math.sqrt(200 * 200 + 100 * 100);
18float ratio = hypotenuse / 200;
19transform.scale(-ratio, 1);
20transform.translate(100 / transform.getScaleX(), 0);
21
22//Create diagonal linear gradient paint.
23LinearGradientPaint paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
24 new float [] {0, 1}, new Color [] {Color.RED, Color.BLUE}, MultipleGradientPaint.CycleMethod.NO_CYCLE,
25 MultipleGradientPaint.ColorSpaceType.SRGB, transform);
26
27//Set paint
28document.setPaint(paint);
29//Fill the rectangle
30document.fill(rectangle);
31
32//Close current page
33document.closePage();
34//Save the document
35document.save();
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
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "RadialGradient1_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Create a rectangle
10Rectangle2D.Float rectangle = new Rectangle2D.Float(200, 100, 200, 200);
11
12//Create arrays of colors and fractions for the gradient.
13Color[] colors = { Color.GREEN, Color.BLUE, Color.BLACK, Color.YELLOW, new Color(245, 245, 220), Color.RED };
14float[] fractions = { 0.0f, 0.2f, 0.3f, 0.4f, 0.9f, 1.0f };
15
16//Create horizontal linear gradient paint. Scale components in the transform must be equal to width and heigh of the rectangle.
17//Translation components are offsets of the rectangle.
18AffineTransform transform = new AffineTransform(200, 0, 0, 200, 200, 100);
19
20//Create radial gradient paint.
21RadialGradientPaint paint = new RadialGradientPaint(new Point2D.Float(300, 200), 100, new Point2D.Float(300, 200),
22 fractions, colors, MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
23 transform);
24
25//Set paint
26document.setPaint(paint);
27//Fill the rectangle
28document.fill(rectangle);
29
30//Close current page
31document.closePage();
32//Save the document
33document.save();
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
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "RadialGradient2_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Create a circle
10Ellipse2D.Float circle = new Ellipse2D.Float(200, 100, 200, 200);
11
12//Create arrays of colors and fractions for the gradient.
13Color[] colors = { Color.WHITE, Color.WHITE, Color.BLUE };
14float[] fractions = { 0.0f, 0.2f, 1.0f };
15
16//Create horizontal linear gradient paint. Scale components in the transform must be equal to width and heigh of the rectangle.
17//Translation components are offsets of the rectangle.
18AffineTransform transform = new AffineTransform(200, 0, 0, 200, 200, 100);
19
20//Create radial gradient paint.
21RadialGradientPaint paint = new RadialGradientPaint(new Point2D.Float(64, 64), 68, new Point2D.Float(24, 24),
22 fractions, colors, MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
23 transform);
24
25//Set paint
26document.setPaint(paint);
27//Fill the circle
28document.fill(circle);
29
30//Close current page
31document.closePage();
32//Save the document
33document.save();
O resultado
Veja como trabalhar com gradiente em documentos PS em .NET.
Pode descarregar exemplos e ficheiros de dados do GitHub.