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:

  1. Crie um fluxo de saída para o ficheiro PS resultante.
  2. Crie o objeto PsSaveOptions com as opções padrão.
  3. Crie um PsDocument de 1 página com um fluxo de saída já criado e opções de guardar.
  4. Crie um novo estado gráfico.
  5. Crie java.awt.BufferedImage a partir do ficheiro de imagem.
  6. Crie a transformação necessária para a imagem.
  7. 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.
  8. Saia do estado gráfico atual para o nível superior.
  9. Feche a página.
  10. Guarde o documento.
 1// Add transparent image to PS document.
 2
 3String outputFileName = "AddTransparentImage_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7//Set page's background color to see white image on it's own transparent background
 8options.setBackgroundColor(new Color(211, 8, 48));
 9
10// Create new 1-paged PS Document
11PsDocument document = new PsDocument(getOutputDir() + outputFileName, options, false);
12
13//document.setPaint(new Color(211, 8, 48));
14//document.fill(new Rectangle2D.Float(0, 0, (int) options.getPageSize().getWidth(), 300));
15
16document.writeGraphicsSave();
17document.translate(20, 100);
18
19//Create an image from translucent image file
20BufferedImage image = ImageIO.read(new File(getDataDir() + "mask1.png"));
21
22//Add this image to document as usual opaque RGB image
23document.drawImage(image, new AffineTransform(1, 0, 0, 1, 100, 0), null);
24
25//Add this image to document as transparent image
26document.drawTransparentImage(image, new AffineTransform(1, 0, 0, 1, 350, 0), 255);
27
28document.writeGraphicsRestore();
29
30//Close current page
31document.closePage();
32
33//Save the document
34document.save();

Veja como trabalhar com transparência em documentos PS em .NET.

O resultado da execução deste código é o seguinte:

Adicionar Imagem Transparente

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// Apply pseudo-transparency transparent image to PS document.
 2
 3String outputFileName = "ApplyPseudoTranparency_outPS.ps";
 4
 5//Create save options with A4 size
 6PsSaveOptions options = new PsSaveOptions();
 7//Set page's background color to see white image on it's own transparent background
 8options.setBackgroundColor(new Color(211, 8, 48));
 9
10// Create new 1-paged PS Document
11PsDocument document = new PsDocument(getOutputDir() + outputFileName, options, false);
12
13float offsetX = 50;
14float offsetY = 100;
15float width = 200;
16float height = 100;
17
18///////////////////////////////// Create rectangle with opaque gradient fill /////////////////////////////////////////////////////////
19GeneralPath path = new GeneralPath();
20path.append(new Rectangle2D.Float(offsetX, offsetY, width, height), false);
21
22LinearGradientPaint opaquePaint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
23        new float[] {0f, 1f}, new Color[] {new Color(0, 0, 0), new Color(40, 128, 70)} , MultipleGradientPaint.CycleMethod.NO_CYCLE,
24        MultipleGradientPaint.ColorSpaceType.SRGB, new AffineTransform(width, 0, 0, height, offsetX, offsetY));
25
26document.setPaint(opaquePaint);
27document.fill(path);
28
29offsetX = 350;
30
31///////////////////////////////// Create rectangle with translucent gradient fill ///////////////////////////////////////////////////
32path = new GeneralPath();
33path.append(new Rectangle2D.Float(offsetX, offsetY, width, height), false);
34
35LinearGradientPaint translucentPaint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(width, height),
36        new float[] {0f, 1f}, new Color[] {new Color(0, 0, 0, 150), new Color(40, 128, 70, 50)}, MultipleGradientPaint.CycleMethod.NO_CYCLE,
37        MultipleGradientPaint.ColorSpaceType.SRGB, new AffineTransform(width, 0, 0, height, offsetX, offsetY));
38
39document.setPaint(translucentPaint);
40document.fill(path);
41
42//Close current page
43document.closePage();
44
45//Save the document
46document.save();

Veja como trabalhar com transparência em documentos PS em .NET e C++.

O resultado da execução deste código é apresentado como

Mostrar Pseudo Transparência

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.