Работа с прозрачностью в PS-файле | Java
Добавить прозрачность в документ PS
PostScript не поддерживает прозрачность при рисовании объектов векторной графики. Однако полупрозрачные (частично прозрачные) изображения можно визуализировать как набор полностью прозрачных и полностью непрозрачных пикселей. Такие изображения называются масками.
Библиотека Aspose.Page для Java предлагает метод, который добавляет прозрачное изображение в документ PS. Что касается рисования векторной графики: фигур или текста, мы предлагаем “псевдопрозрачность”. «Псевдопрозрачность» — это процесс обесцвечивания цветов, у которых альфа-компонент меньше 255. Это достигается путем смешивания красного, зеленого и синего компонентов с альфа-компонентом. “Псевдопрозрачность”, конечно, не позволяет увидеть нижний цветной слой из-под верхнего прозрачного слоя, но создает иллюзию прозрачности, если нижний слой белый.
Добавить прозрачное изображение в документ PS
Как мы писали ранее, прозрачные изображения можно добавлять в документ PS в качестве маски, и библиотека Aspose.Page для Java предлагает для этой цели метод addTransparentImage(). Этот метод определяет, является ли изображение полностью непрозрачным, полностью прозрачным или полупрозрачным. Если оно полностью непрозрачно, оно добавляется как непрозрачное изображение в методе addImage(). если оно полностью прозрачное, оно вообще не добавляется в документ, если это полупрозрачное изображение, оно добавляется как маска изображения PostScript.
В примере ниже мы демонстрируем разницу между добавлением прозрачного изображения в документ PS с помощью addImage() и addTransparentImage(). Чтобы увидеть белое полупрозрачное изображение, под изображениями поместим большой красный прямоугольник.
Чтобы добавить любое изображение в новый PsDocument с помощью библиотеки Aspose.Page для Java, в этом примере мы выполняем следующие шаги:
- Создайте выходной поток для полученного PS-файла.
- Создайте объект PsSaveOptions с параметрами по умолчанию.
- Создайте одностраничный PsDocument с уже созданным потоком вывода и сохраните параметры.
- Создайте новое графическое состояние.
- Создайте java.awt.BufferedImage из файла изображения.
- Создайте необходимое преобразование изображения.
- Добавьте изображение в PsDocument как полностью непрозрачное изображение (с помощью метода addImage()), если мы уверены, что изображение непрозрачное, или добавьте его как прозрачное изображение (с помощью метода addTransparentImage()). если мы не уверены, что изображение непрозрачно.
- Выход из текущего состояния графики на верхний уровень.
- Закройте страницу.
- Сохраните документ.
1//Create an output stream for PostScript document
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "AddTransparentImage_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9//Add big red rectangle under images to see the difference between addImage() and addTransparentImage() methods
10document.setPaint(new Color(211, 8, 48));
11document.fill(new Rectangle2D.Float(0, 0, (int) options.getPageSize().getWidth(), 300));
12
13document.writeGraphicsSave();
14document.translate(20, 100);
15
16//Create an image from translucent image file
17BufferedImage image = ImageIO.read(new File(dataDir + "mask1.png"));
18
19//Add this image to document as usual opaque RGB image
20document.drawImage(image, new AffineTransform(1, 0, 0, 1, 100, 0), null);
21
22//Add this image to document as transparent image
23document.drawTransparentImage(image, new AffineTransform(1, 0, 0, 1, 350, 0), 255);
24
25document.writeGraphicsRestore();
26
27//Close current page
28document.closePage();
29//Save the document
30document.save();
См. работу с прозрачностью в документе PS в .NET.
Результат запуска этого кода следующий
Добавление прозрачного объекта векторной графики
Ранее мы писали, что библиотека Aspose.Page для Java использует алгоритм очистки прозрачных фигур и текста, который мы назвали “псевдопрозрачностью”.
В примере ниже мы демонстрируем разницу между двумя фигурами, окрашенными в один и тот же цвет, но в первой фигуре без компонента «Альфа», а во втором случае — с компонентом «Альфа».
1//Create an output stream for PostScript document
2FileOutputStream outPsStream = new FileOutputStream(dataDir + "ShowPseudoTransparency_outPS.ps");
3//Create save options with A4 size
4PsSaveOptions options = new PsSaveOptions();
5
6//Create new PS Document with the page opened
7PsDocument document = new PsDocument(outPsStream, options, false);
8
9float offsetX = 50;
10float offsetY = 100;
11float width = 200;
12float height = 100;
13
14///////////////////////////////// Create rectangle with opaque gradient fill ////////////////////////////////////////////////////////
15Rectangle2D.Float rectangle = new Rectangle2D.Float(offsetX, offsetY, width, height);
16
17LinearGradientPaint paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
18 new float [] {0, 1}, new Color [] {new Color(0, 0, 0), new Color(40, 128, 70)},
19 MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
20 new AffineTransform(width, 0, 0, height, offsetX, offsetY));
21
22//Set paint
23document.setPaint(paint);
24//Fill the rectangle
25document.fill(rectangle);
26/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
27
28offsetX = 350;
29
30///////////////////////////////// Create rectangle with translucent gradient fill ///////////////////////////////////////////////////
31rectangle = new Rectangle2D.Float(offsetX, offsetY, width, height);
32
33paint = new LinearGradientPaint(new Point2D.Float(0, 0), new Point2D.Float(200, 100),
34new float [] {0, 1}, new Color [] {new Color(0, 0, 0, 150), new Color(40, 128, 70, 50)},
35MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB,
36new AffineTransform(width, 0, 0, height, offsetX, offsetY));
37
38//Set paint
39document.setPaint(paint);
40//Fill the rectangle
41document.fill(rectangle);
42/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43
44//Close current page
45document.closePage();
46//Save the document
47document.save();
Результат запуска этого кода выглядит так:
Вы можете загрузить примеры и файлы данных с GitHub.