Trabalhar com Transparência em ficheiro PS | Java
Adicionar transparência no documento PS
O PostScript não suporta transparência na pintura de objetos gráficos vetoriais. No entanto, as imagens translúcidas (parcialmente transparentes) podem ser renderizadas como um conjunto de pixéis totalmente transparentes e totalmente opacos. Estas imagens são chamadas de máscaras.
A biblioteca Aspose.Page para Java oferece um método que adiciona a imagem transparente ao documento PS. Para pintar gráficos vectoriais: formas ou texto, oferecemos “pseudotransparência”. “Pseudotransparência” é um processo de palidez de cor com uma componente Alfa inferior a 255. É conseguida pela mistura dos componentes Vermelho, Verde e Azul com uma componente Alfa. “Pseudotransparência”, claro, não nos permite ver a camada colorida inferior por baixo da camada transparente superior, mas cria uma ilusão de transparência se a camada inferior for branca.
Adicionar imagem transparente num documento PS
Como já referimos anteriormente, as imagens transparentes podem ser adicionadas ao documento PS como uma máscara e a biblioteca Aspose.Page para Java oferece para este efeito o método addTransparentImage(). Este método reconhece se a imagem é totalmente opaca, totalmente transparente ou translúcida. Se for totalmente opaca, é adicionada como a imagem opaca no método addImage(); se for totalmente transparente, não é adicionada ao documento; se for a imagem translúcida, é adicionada como uma máscara de imagem PostScript.
No exemplo abaixo, demonstramos a diferença entre adicionar uma imagem transparente num documento PS com addImage() e addTransparentImage(). Para visualizar a imagem branca translúcida, colocamos um grande retângulo vermelho por baixo das imagens.
Para adicionar qualquer imagem a um novo PsDocument com a biblioteca Aspose.Page para Java, neste exemplo, seguimos os seguintes passos:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie o objeto PsSaveOptions com as opções padrão.
- Crie um PsDocument de 1 página com um fluxo de saída já criado e opções de guardar.
- Crie um novo estado gráfico.
- Crie java.awt.BufferedImage a partir do ficheiro de imagem.
- Crie a transformação necessária para a imagem.
- Adicione a imagem ao PsDocument como uma imagem totalmente opaca (utilizando o método addImage()) se tivermos a certeza de que a imagem é opaca ou adicione uma como uma imagem transparente (utilizando o método addTransparentImage()) se não tivermos a certeza de que a imagem é opaca.
- Saia do estado gráfico atual para o nível superior.
- Feche a página.
- Guarde o documento.
1//Create an output stream for PostScript document
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "AddTransparentImage_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//Add big red rectangle under images to see the difference between addImage() and addTransparentImage() methods
10document.setPaint(new Color(211, 8, 48));
11document.fill(new Rectangle2D.Float(0, 0, (int) options.getPageSize().getWidth(), 300));
12
13document.writeGraphicsSave();
14document.translate(20, 100);
15
16//Create an image from translucent image file
17BufferedImage image = ImageIO.read(new File(dataDir + "mask1.png"));
18
19//Add this image to document as usual opaque RGB image
20document.drawImage(image, new AffineTransform(1, 0, 0, 1, 100, 0), null);
21
22//Add this image to document as transparent image
23document.drawTransparentImage(image, new AffineTransform(1, 0, 0, 1, 350, 0), 255);
24
25document.writeGraphicsRestore();
26
27//Close current page
28document.closePage();
29//Save the document
30document.save();
Veja como trabalhar com transparência em documentos PS em .NET.
O resultado da execução deste código é o seguinte:
Adicionar objeto gráfico vetorial transparente
Anteriormente, escrevemos que a biblioteca Aspose. Page para Java utiliza um algoritmo de paleta para formas e texto transparentes, a que chamamos “pseudo-transparência”.
No exemplo abaixo, demonstramos a diferença entre duas formas pintadas com a mesma cor, mas na primeira forma sem a componente Alfa e no segundo caso com a componente Alfa.
1//Create an output stream for PostScript document
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "ShowPseudoTransparency_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
9float offsetX = 50;
10float offsetY = 100;
11float width = 200;
12float height = 100;
13
14///////////////////////////////// Create rectangle with opaque gradient fill ////////////////////////////////////////////////////////
15Rectangle2D.Float rectangle = new Rectangle2D.Float(offsetX, offsetY, width, height);
16
17LinearGradientPaint paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
18 new float [] {0, 1}, new Color [] {new Color(0, 0, 0), new Color(40, 128, 70)},
19 MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
20 new AffineTransform(width, 0, 0, height, offsetX, offsetY));
21
22//Set paint
23document.setPaint(paint);
24//Fill the rectangle
25document.fill(rectangle);
26/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
27
28offsetX = 350;
29
30///////////////////////////////// Create rectangle with translucent gradient fill ///////////////////////////////////////////////////
31rectangle = new Rectangle2D.Float(offsetX, offsetY, width, height);
32
33paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
34new float [] {0, 1}, new Color [] {new Color(0, 0, 0, 150), new Color(40, 128, 70, 50)},
35MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
36new AffineTransform(width, 0, 0, height, offsetX, offsetY));
37
38//Set paint
39document.setPaint(paint);
40//Fill the rectangle
41document.fill(rectangle);
42/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43
44//Close current page
45document.closePage();
46//Save the document
47document.save();
O resultado da execução deste código é apresentado como
Pode descarregar exemplos e ficheiros de dados do GitHub.