Trabajar con transparencia en un archivo PS | Pitón

Agregar transparencia en el documento PS

Agregar transparencia a documentos PS es bastante desafiante ya que PostScript no admite inherentemente la transparencia al pintar objetos de gráficos vectoriales. Sin embargo, las imágenes translúcidas se pueden representar mediante una combinación de píxeles totalmente transparentes y totalmente opacos, a menudo denominados máscaras.

Aspose.Page para Python vía .NET proporciona un método para agregar imágenes transparentes a documentos PS. Para pintar gráficos vectoriales como formas o texto, empleamos una técnica conocida como “pseudotransparencia”. Esto implica aclarar colores con un componente Alfa de menos de 255 mezclando los componentes Rojo, Verde y Azul con un Alfa de uno. Si bien la “pseudotransparencia” no ofrece una verdadera visibilidad de las capas debajo de las capas transparentes, crea la ilusión de transparencia, especialmente cuando la capa inferior es blanca.

Agregar imagen transparente al documento PS

Como se mencionó anteriormente, Aspose.Page para Python a través de la biblioteca .NET ofrece el método add_transparent_image() para agregar imágenes transparentes a documentos PS. Este método distingue si la imagen es completamente opaca, completamente transparente o translúcida. Si la imagen es completamente opaca, se agrega usando el método add_image(). Si es completamente transparente, no se agrega nada. Para imágenes translúcidas, se agrega como una máscara de imagen PostScript.

En el siguiente ejemplo, ilustramos la distinción entre agregar una imagen transparente en un documento PS usando add_image() y add_transparent_image(). Para visualizar la imagen blanca translúcida, hemos colocado un gran rectángulo rojo debajo de las imágenes.

Para agregar una imagen a un nuevo PsDocument usando Aspose.Page para Python a través de la biblioteca .NET, seguimos estos pasos:

  1. Cree una secuencia de salida para el archivo PS resultante.
  2. Cree un objeto PsSaveOptions con las opciones predeterminadas.
  3. Cree un PsDocument de 1 página con un flujo de salida ya creado y opciones para guardar.
  4. Cree un nuevo estado de gráficos.
  5. Cree aspose.pydrawing.Bitmap a partir de un archivo de imagen.
  6. Crea la transformación necesaria para la imagen.
  7. Agregue la imagen a PsDocument como una imagen completamente opaca (usando el método add_image()) si estamos seguros de que la imagen es opaca o agregue una como imagen transparente (usando el método add_transparent_image()) si no estamos seguros de que la imagen sea opaca.
  8. Salga del estado de gráficos actual al nivel superior.
  9. Cierra la página.
  10. Guarde el 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()

Ver cómo trabajar con transparencia en un documento PS en .NET, Java.

El resultado de ejecutar este código es

Agregar imagen transparente

Agregar un objeto de gráficos vectoriales transparentes

Anteriormente escribimos que esta solución API utiliza un algoritmo de palidez para formas y texto transparentes, al que llamamos “pseudotransparencia”. En el siguiente ejemplo demostramos una diferencia entre dos formas pintadas con el mismo color, pero en la primera forma no tiene el componente Alfa y en el segundo caso tiene el componente Alfa.

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

Vea cómo trabajar con transparencia en documentos PS en .NET, Java.

El resultado de ejecutar este código es

Mostrar pseudotransparencia

Puede descargar ejemplos y archivos de datos desde GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.