Работа с прозрачностью в PS-файле | Питон

Добавить прозрачность в документ PS

Добавление прозрачности в документы PS довольно сложно, поскольку PostScript по своей сути не поддерживает прозрачность при рисовании объектов векторной графики. Однако полупрозрачные изображения могут быть представлены комбинацией полностью прозрачных и полностью непрозрачных пикселей, часто называемых масками.

Aspose.Page для Python через .NET предоставляет метод добавления прозрачных изображений в документы PS. Для рисования векторной графики, такой как фигуры или текст, мы используем технику, известную как ** «псевдопрозрачность»**. Это предполагает осветление цветов с альфа-компонентом менее 255 путем смешивания красного, зеленого и синего компонентов с альфа-компонентом, равным единице. Хотя “псевдопрозрачность” не обеспечивает истинную видимость слоев под прозрачными слоями, она создает иллюзию прозрачности, особенно когда нижний слой белый.

Добавить прозрачное изображение в документ PS

Как упоминалось ранее, Aspose.Page для Python через библиотеку .NET предлагает метод add_transparent_image() для добавления прозрачных изображений в документы PS. Этот метод определяет, является ли изображение полностью непрозрачным, полностью прозрачным или полупрозрачным. Если изображение полностью непрозрачно, оно добавляется с помощью метода add_image(). Если он полностью прозрачен, он вообще не добавляется. Для полупрозрачных изображений он добавляется как маска изображения PostScript.

В приведенном ниже примере мы иллюстрируем разницу между добавлением прозрачного изображения в документ PS с помощью add_image() и add_transparent_image(). Чтобы визуализировать белое полупрозрачное изображение, мы поместили под изображениями большой красный прямоугольник.

Чтобы добавить изображение в новый PsDocument с помощью Aspose.Page для Python через библиотеку .NET, выполните следующие действия:

  1. Создайте выходной поток для полученного PS-файла.
  2. Создайте объект PsSaveOptions с параметрами по умолчанию.
  3. Создайте одностраничный PsDocument с уже созданным потоком вывода и сохраните параметры.
  4. Создайте новое графическое состояние.
  5. Создайте aspose.pydrawing.Bitmap из файла изображения.
  6. Создайте необходимое преобразование изображения.
  7. Добавьте изображение в PsDocument как полностью непрозрачное изображение (с помощью метода add_image()), если мы уверены, что изображение непрозрачное, или добавьте его как прозрачное изображение (с помощью метода add_transparent_image()). если мы не уверены, что изображение непрозрачно.
  8. Выход из текущего состояния графики на верхний уровень.
  9. Закройте страницу.
  10. Сохраните документ.
 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()

См. работу с прозрачностью в документе PS в .NET, Java.

Результат запуска этого кода:

Добавить прозрачное изображение

Добавление прозрачного объекта векторной графики

Ранее мы писали, что это API-решение использует алгоритм очистки прозрачных фигур и текста, который мы назвали “псевдопрозрачностью”. В следующем примере мы демонстрируем разницу между двумя фигурами, окрашенными в один и тот же цвет, но в первой фигуре нет альфа-компонента, а во втором случае есть этот компонент.

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

См. работу с прозрачностью в документах PS в .NET, Java.

Результат запуска этого кода:

Показать псевдопрозрачность

Вы можете загрузить примеры и файлы данных с сайта GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.