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//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 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//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();

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.