Trabalhar com Transparência em PostScript | .NET

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 .NET 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 combinação específica 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 .NET 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 ver a imagem branca translúcida, definimos a cor de fundo da página como não branca.

Para adicionar qualquer imagem a um novo PsDocument com a biblioteca Aspose.Page para .NET, neste exemplo, seguimos os seguintes passos:

  1. Crie um fluxo de saída para o ficheiro PS resultante.
  2. Crie um objeto PsSaveOptions com as opções padrão. Altere a cor de fundo, se necessário.
  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 um Bitmap 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
 2using (Stream outPsStream = new FileStream(dataDir + "AddTransparentImage_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6    //Set page's background color to see white image on it's own transparent background
 7    options.BackgroundColor = Color.FromArgb(211, 8, 48);
 8
 9    // Create new 1-paged PS Document
10    PsDocument document = new PsDocument(outPsStream, options, false);
11
12
13    document.WriteGraphicsSave();
14    document.Translate(20, 100);
15
16    //Create a bitmap from translucent image file
17    using (Bitmap image = new Bitmap(dataDir + "mask1.png"))
18    {
19        //Add this image to the document as usual opaque RGB image
20        document.DrawImage(image, new Matrix(1, 0, 0, 1, 100, 0), Color.Empty);
21    }
22
23    //Again create a bitmap from the same image file
24    using (Bitmap image = new Bitmap(dataDir + "mask1.png"))
25    {
26        //Add this image to the document as transparent image
27        document.DrawTransparentImage(image, new Matrix(1, 0, 0, 1, 350, 0), 255);
28    }
29
30    document.WriteGraphicsRestore();
31
32    //Close current page
33    document.ClosePage();
34
35    //Save the document
36    document.Save();
37}

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.Bitmap em vez de System.Drawing.Bitmap, Aspose.Page.Drawing.Drawing2D.Matrix será utilizado em vez de System.Drawing.Drawing2D.Matrix e assim por diante. Os nossos exemplos de código no GitHub contêm todas as substituições necessárias.

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

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 .NET 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
 2using (Stream outPsStream = new FileStream(dataDir + "ShowPseudoTransparency_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6
 7    // Create new 1-paged PS Document
 8    PsDocument document = new PsDocument(outPsStream, options, false);
 9
10    float offsetX = 50;
11    float offsetY = 100;
12    float width = 200;
13    float height = 100;
14
15///////////////////////////////// Create a rectangle with opaque gradient fill /////////////////////////////////////////////////////////
16    GraphicsPath path = new GraphicsPath();
17    path.AddRectangle(new RectangleF(50, 100, 200, 100));
18
19    LinearGradientBrush opaqueBrush = new LinearGradientBrush(new RectangleF(0, 0, 200, 100), Color.FromArgb(0, 0, 0),
20        Color.FromArgb(40, 128, 70), 0f);
21    Matrix brushTransform = new Matrix(200, 0, 0, 100, 50, 100);
22    opaqueBrush.Transform = brushTransform;
23    Aspose.Page.EPS.GradientBrush gradientBrush = new GradientBrush(opaqueBrush);
24    gradientBrush.WrapMode = WrapMode.Clamp;
25
26    document.SetPaint(gradientBrush);
27    document.Fill(path);
28/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
29
30    offsetX = 350;
31
32///////////////////////////////// Create a rectangle with translucent gradient fill ///////////////////////////////////////////////////
33    //Create graphics path from the first rectangle
34    path = new GraphicsPath();
35    path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
36
37    //Create linear gradient brush colors which transparency are not 255, but 150 and 50. So it are translucent.
38    LinearGradientBrush translucentBrush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.FromArgb(150, 0, 0, 0),
39        Color.FromArgb(50, 40, 128, 70), 0f);
40    //Create a transform for the brush.
41    brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
42    //Set the transform
43    translucentBrush.Transform = brushTransform;
44    
45    //Set the paint
46    document.SetPaint(translucentBrush);
47    //Fill the rectangle
48    document.Fill(path);
49/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
50
51    //Close current page
52    document.ClosePage();
53
54    //Save the document
55    document.Save();
56}

Veja como trabalhar com transparência em documentos PS em Java 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.