Lavorare con la trasparenza in un file PS | Python
Aggiungere trasparenza in un documento PS
Aggiungere trasparenza ai documenti PS è piuttosto impegnativo, poiché PostScript non supporta di per sé la trasparenza nella pittura di oggetti di grafica vettoriale. Tuttavia, le immagini traslucide possono essere rappresentate da una combinazione di pixel completamente trasparenti e completamente opachi, spesso chiamati maschere.
Aspose.Page per Python tramite .NET fornisce un metodo per aggiungere immagini trasparenti ai documenti PS. Per la pittura di grafica vettoriale come forme o testo, utilizziamo una tecnica nota come “pseudo-trasparenza”. Questa tecnica consiste nello schiarire i colori con una componente alfa inferiore a 255, miscelando le componenti rosso, verde e blu con una componente alfa pari a uno. Sebbene la “pseudo-trasparenza” non offra una vera visibilità dei livelli sottostanti i livelli trasparenti, crea l’illusione di trasparenza, soprattutto quando il livello inferiore è bianco.
Aggiungere un’immagine trasparente a un documento PS
Come accennato in precedenza, Aspose.Page per Python tramite la libreria .NET offre il metodo add_transparent_image() per aggiungere immagini trasparenti ai documenti PS. Questo metodo distingue se l’immagine è completamente opaca, completamente trasparente o traslucida. Se l’immagine è completamente opaca, viene aggiunta utilizzando il metodo add_image(). Se è completamente trasparente, non viene aggiunta. Per le immagini traslucide, viene aggiunta come maschera immagine PostScript.
Nell’esempio seguente, illustriamo la distinzione tra l’aggiunta di un’immagine trasparente in un documento PS utilizzando sia add_image() che add_transparent_image(). Per visualizzare l’immagine bianca traslucida, abbiamo posizionato un grande rettangolo rosso sotto le immagini.
Per aggiungere un’immagine a un nuovo PsDocument utilizzando Aspose.Page per Python tramite la libreria .NET, seguiamo questi passaggi:
- Creare un flusso di output per il file PS risultante. 2. Creare un oggetto PsSaveOptions con le opzioni predefinite.
- Creare un PsDocument a pagina singola con un flusso di output già creato e opzioni di salvataggio.
- Creare un nuovo stato grafico.
- Creare aspose.pydrawing.Bitmap da un file immagine.
- Creare la trasformazione necessaria per l’immagine.
- Aggiungere l’immagine a PsDocument come immagine completamente opaca (utilizzando il metodo add_image()) se siamo sicuri che l’immagine sia opaca, oppure aggiungerne una come immagine trasparente (utilizzando il metodo add_transparent_image()) se non siamo sicuri che l’immagine sia opaca.
- Uscire dallo stato grafico corrente e passare a quello di livello superiore.
- Chiudere la pagina.
- Salvare il 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()
Il risultato dell’esecuzione di questo codice è
Aggiunta di un oggetto grafico vettoriale trasparente
In precedenza abbiamo scritto che questa soluzione API utilizza un algoritmo di trasparenza per forme e testo trasparenti, che abbiamo chiamato “pseudo-trasparenza”. Nel prossimo esempio mostriamo una differenza tra due forme dipinte con lo stesso colore, ma nella prima forma è priva del componente Alpha e nel secondo caso lo è.
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()
Il risultato dell’esecuzione di questo codice è
È possibile scaricare esempi e file di dati da GitHub.