Lavorare con la trasparenza in un file PS | Java
Aggiungere trasparenza in un documento PS
PostScript non supporta la trasparenza nella pittura di oggetti di grafica vettoriale. Tuttavia, le immagini traslucide (parzialmente trasparenti) possono essere renderizzate come un insieme di pixel completamente trasparenti e completamente opachi. Tali immagini sono chiamate maschere.
La libreria Aspose.Page per Java offre un metodo che aggiunge l’immagine trasparente al documento PS. Per quanto riguarda la pittura di grafica vettoriale: forme o testo, offriamo la “pseudo-trasparenza”. La “pseudo-trasparenza” è un processo di schiarimento dei colori con una componente alfa inferiore a 255. Si ottiene mescolando le componenti rosso, verde e blu con la componente alfa 1. La “pseudo-trasparenza”, ovviamente, non ci permette di vedere il livello colorato inferiore da sotto il livello trasparente superiore, ma crea un’illusione di trasparenza se il livello inferiore è bianco.
Aggiungere un’immagine trasparente in un documento PS
Come accennato in precedenza, le immagini trasparenti possono essere aggiunte al documento PS come maschera e la libreria Aspose.Page per Java offre a questo scopo il metodo addTransparentImage(). Questo metodo riconosce se l’immagine è completamente opaca, trasparente o traslucida. Se è completamente opaca, viene aggiunta come immagine opaca nel metodo addImage(), se è completamente trasparente, non viene aggiunta al documento, mentre se è traslucida, viene aggiunta come maschera di immagine PostScript.
Nell’esempio seguente mostriamo la differenza tra l’aggiunta di un’immagine trasparente in un documento PS con addImage() e addTransparentImage(). Per visualizzare l’immagine bianca traslucida, inseriamo un grande rettangolo rosso sotto le immagini.
Per aggiungere un’immagine a un nuovo PsDocument con la libreria Aspose.Page per Java, in questo esempio seguiamo i seguenti passaggi:
- Creiamo un flusso di output per il file PS risultante.
- Creiamo un oggetto PsSaveOptions con le opzioni predefinite.
- Creiamo un PsDocument a pagina singola con un flusso di output già creato e opzioni di salvataggio.
- Creiamo un nuovo stato grafico.
- Creiamo java.awt.BufferedImage dal file immagine.
- Creiamo la trasformazione necessaria per l’immagine. 7. Aggiungere l’immagine a PsDocument come immagine completamente opaca (utilizzando il metodo addImage()) se siamo sicuri che l’immagine sia opaca, oppure aggiungerne una come immagine trasparente (utilizzando il metodo addTransparentImage()) se non siamo sicuri che l’immagine sia opaca.
- Uscire dallo stato grafico corrente e tornare al livello superiore.
- Chiudere la pagina.
- Salvare il documento.
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();
Vedi come lavorare con la trasparenza in un documento PS in .NET.
Il risultato dell’esecuzione di questo codice è il seguente:
Aggiunta di un oggetto grafico vettoriale trasparente
In precedenza abbiamo scritto che la libreria Aspose.Page per Java utilizza un algoritmo di trasparenza per forme e testo trasparenti, che abbiamo chiamato “pseudo-trasparenza”.
Nell’esempio seguente mostriamo una differenza tra due forme dipinte con lo stesso colore, ma nella prima forma senza il componente Alpha e nel secondo caso con il componente Alpha.
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();
Il risultato dell’esecuzione di questo codice viene visualizzato come
È possibile scaricare esempi e file di dati da GitHub.