Trabalhar com Transparência em Arquivo PS | Python
Adicionar transparência no documento PS
Adicionar transparência aos documentos PS é bastante desafiante, uma vez que o PostScript não suporta inerentemente a transparência na pintura de objetos gráficos vetoriais. No entanto, as imagens translúcidas podem ser representadas por uma combinação de pixéis totalmente transparentes e totalmente opacos, frequentemente designados por máscaras.
O Aspose.Page para Python via .NET fornece um método para adicionar imagens transparentes a documentos PS. Para pintar gráficos vectoriais, como formas ou texto, empregamos uma técnica conhecida como “pseudotransparência”. Isto envolve o branqueamento de cores com um componente Alfa inferior a 255, fundindo os componentes Vermelho, Verde e Azul com um Alfa de 1. Embora a “pseudotransparência” não ofereça uma visibilidade real das camadas abaixo das camadas transparentes, cria a ilusão de transparência, especialmente quando a camada inferior é branca.
Adicionar imagem transparente a documento PS
Como referido anteriormente, a biblioteca Aspose.Page para Python via .NET oferece o método add_transparent_image() para adicionar imagens transparentes a documentos PS. Este método distingue se a imagem é totalmente opaca, totalmente transparente ou translúcida. Se a imagem for totalmente opaca, é adicionada através do método add_image(). Se for totalmente transparente, não é adicionada. Para imagens translúcidas, é adicionada como uma máscara de imagem PostScript.
No exemplo abaixo, ilustramos a diferença entre adicionar uma imagem transparente num documento PS utilizando add_image() e add_transparent_image(). Para visualizar a imagem branca translúcida, colocamos um grande retângulo vermelho por baixo das imagens.
Para adicionar uma imagem a um novo PsDocument utilizando o Aspose.Page para Python através da biblioteca .NET, seguimos os seguintes passos:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie um 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 aspose.pydrawing.Bitmap a partir de um 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 add_image()) se tivermos a certeza de que a imagem é opaca ou adicione uma imagem transparente (utilizando o método add_transparent_image()) 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# The path to the documents directory.
2data_dir = Util.get_data_dir_working_with_transparency()
3
4# Create an output stream for the PostScript document
5with open(data_dir + "AddTransparentImage_outPS.ps", "wb") as out_ps_stream:
6 # Create the save options with the A4 size
7 options = PsSaveOptions()
8 # Set the page's background color to see a white image on it's own transparent background
9 options.background_color = aspose.pydrawing.Color.from_argb(211, 8, 48)
10
11 # Create a new 1-paged PS Document
12 document = PsDocument(out_ps_stream, options, False)
13
14
15 document.write_graphics_save()
16 document.translate(20, 100)
17
18 # Create a bitmap from the translucent image file
19 with aspose.pydrawing.Bitmap(data_dir + "mask1.png") as image:
20 # Add this image to the document as a regular opaque RGB image
21 document.draw_image(image, aspose.pydrawing.drawing2d.Matrix(1., 0., 0., 1., 100., 0.), aspose.pydrawing.Color())
22
23 # Create another bitmap from the same image file
24 with aspose.pydrawing.Bitmap(data_dir + "mask1.png") as image:
25 # Add this image to the document as a transparent image
26 document.draw_transparent_image(image, aspose.pydrawing.drawing2d.Matrix(1., 0., 0., 1., 350., 0.), 255)
27
28 document.write_graphics_restore()
29
30 # Close the current page
31 document.close_page()
32
33 #Save the document
34 document.save()
O resultado da execução deste código é
Adicionar objeto gráfico vetorial transparente
Anteriormente, escrevemos que esta Solução API utiliza um algoritmo de paleta para formas e texto transparentes, a que chamamos “pseudo-transparência”. No próximo exemplo, demonstramos a diferença entre duas formas pintadas com a mesma cor, mas na primeira forma está sem o componente Alfa e no segundo caso tem o componente.
1# The path to the documents directory.
2data_dir = Util.get_data_dir_working_with_transparency()
3
4# Create an output stream for the PostScript document
5with open(data_dir + "ShowPseudoTransparency_outPS.ps", "wb") as out_ps_stream:
6 # Create the save options with A4 size
7 options = PsSaveOptions()
8
9 # Create a new 1-paged PS Document
10 document = PsDocument(out_ps_stream, options, False)
11
12 offset_x = 50.
13 offset_y = 100.
14 width = 200.
15 height = 100.
16
17 ################################ Create a rectangle with the opaque gradient fill #######################################################
18 path = aspose.pydrawing.drawing2d.GraphicsPath()
19 path.add_rectangle(aspose.pydrawing.RectangleF(offset_x, offset_y, width, height))
20
21 opaque_brush: aspose.pydrawing.drawing2d.LinearGradientBrush = \
22 GraphicsFactory.create_linear_gradient_brush_by_rect_and_angle(aspose.pydrawing.RectangleF(0, 0, 200, 100), aspose.pydrawing.Color.from_argb(0, 0, 0),
23 aspose.pydrawing.Color.from_argb(40, 128, 70), 0)
24 brush_transform = aspose.pydrawing.drawing2d.Matrix(width, 0., 0., height, offset_x, offset_y)
25 opaque_brush.transform = brush_transform
26 gradient_brush = GradientBrush(opaque_brush)
27 gradient_brush.wrap_mode = aspose.pydrawing.drawing2d.WrapMode.CLAMP
28
29 document.set_paint(gradient_brush)
30 document.fill(path)
31 ####################################################################################################################################
32
33 offset_x = 350.
34
35 ################################ Create a rectangle with the translucent gradient fill ###################################################
36 # Create a graphics path from the first rectangle
37 path = aspose.pydrawing.drawing2d.GraphicsPath()
38 path.add_rectangle(aspose.pydrawing.RectangleF(offset_x, offset_y, width, height))
39
40 # Create linear gradient brush colors which transparency are not 255, but 150 and 50. So it are translucent.
41 translucent_brush: aspose.pydrawing.drawing2d.LinearGradientBrush = \
42 GraphicsFactory.create_linear_gradient_brush_by_rect_and_angle(aspose.pydrawing.RectangleF(0, 0, width, height),
43 aspose.pydrawing.Color.from_argb(150, 0, 0, 0),
44 aspose.pydrawing.Color.from_argb(50, 40, 128, 70), 0)
45 # Create a transform for brush.
46 brush_transform = aspose.pydrawing.drawing2d.Matrix(width, 0., 0., height, offset_x, offset_y)
47 # Set the transform
48 translucent_brush.transform = brush_transform
49 # Create a GradientBrush object containing the linear gradient brush
50 gradient_brush = GradientBrush(translucent_brush)
51 gradient_brush.wrap_mode = aspose.pydrawing.drawing2d.WrapMode.CLAMP
52 # Set the paint
53 document.set_paint(gradient_brush)
54 # Fill the rectangle
55 document.fill(path)
56 ####################################################################################################################################
57
58 # Close the current page
59 document.close_page()
60
61 # Save the document
62 document.save()
O resultado da execução deste código é
Pode descarregar exemplos e ficheiros de dados do GitHub.