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