Travailler avec la transparence dans le fichier PS | Python
Ajouter de la transparence dans le document PS
L’ajout de transparence aux documents PS est assez difficile car PostScript ne prend pas automatiquement en charge la transparence lors de la peinture d’objets graphiques vectoriels. Cependant, les images translucides peuvent être représentées par une combinaison de pixels entièrement transparents et entièrement opaques, souvent appelés masques.
Aspose.Page pour Python via .NET fournit une méthode pour ajouter des images transparentes aux documents PS. Pour peindre des graphiques vectoriels tels que des formes ou du texte, nous utilisons une technique connue sous le nom de “pseudo-transparence”. Cela implique d’éclaircir les couleurs avec un composant Alpha inférieur à 255 en mélangeant les composants rouge, vert et bleu avec un Alpha de un. Bien que la “pseudo-transparence” n’offre pas une véritable visibilité sous les calques transparents, elle crée l’illusion de transparence, en particulier lorsque le calque inférieur est blanc.
Ajouter une image transparente au document PS
Comme mentionné précédemment, Aspose.Page pour Python via la bibliothèque .NET propose la méthode add_transparent_image() pour ajouter des images transparentes aux documents PS. Cette méthode permet de déterminer si l’image est totalement opaque, entièrement transparente ou translucide. Si l’image est entièrement opaque, elle est ajoutée à l’aide de la méthode add_image(). S’il est entièrement transparent, il n’est pas ajouté du tout. Pour les images translucides, il est ajouté sous forme de masque d’image PostScript.
Dans l’exemple ci-dessous, nous illustrons la distinction entre l’ajout d’une image transparente dans un document PS en utilisant à la fois add_image() et add_transparent_image(). Pour visualiser l’image blanche translucide, nous avons placé un grand rectangle rouge sous les images.
Pour ajouter une image à un nouveau PsDocument à l’aide d’Aspose.Page pour Python via la bibliothèque .NET, nous suivons ces étapes :
- Créez un flux de sortie pour le fichier PS résultant.
- Créez un objet PsSaveOptions avec les options par défaut.
- Créez un PsDocument d’une page avec un flux de sortie déjà créé et enregistrez les options.
- Créez un nouvel état graphique.
- Créez aspose.pydrawing.Bitmap à partir d’un fichier image.
- Créez la transformation nécessaire pour l’image.
- Ajoutez l’image à PsDocument en tant qu’image entièrement opaque (en utilisant la méthode add_image()) si nous sommes sûrs que l’image est opaque ou ajoutez-en une en tant qu’image transparente (en utilisant la méthode add_transparent_image()) si nous ne sommes pas sûrs que l’image soit opaque.
- Quittez l’état graphique actuel pour passer à celui du niveau supérieur.
- Fermez la page.
- Enregistrez le document.
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()
Le résultat de l’exécution de ce code est
Ajout d’un objet graphique vectoriel transparent
Plus tôt, nous avons écrit que cette solution API utilise un algorithme de pâleur pour les formes et le texte transparents, que nous avons appelé “pseudo-transparence”. Dans l’exemple suivant, nous démontrons une différence entre deux formes peintes avec la même couleur, mais dans la première forme, elle est sans le composant Alpha et dans le second cas, elle a le composant.
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()
Le résultat de l’exécution de ce code est
Vous pouvez télécharger des exemples et des fichiers de données à partir de GitHub.