Lavorare con la trasparenza in PostScript | .NET

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 .NET 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 miscelando specificamente le componenti rosso, verde e blu con la componente alfa.

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.

Aggiunta di 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 .NET 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 tramite il 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 traslucida bianca, impostiamo il colore di sfondo della pagina su un colore diverso dal bianco.

Per aggiungere un’immagine a un nuovo PsDocument con la libreria Aspose.Page per .NET, in questo esempio seguiamo i seguenti passaggi:

  1. Creiamo un flusso di output per il file PS risultante.
  2. Creiamo un oggetto PsSaveOptions con le opzioni predefinite. Se necessario, modifichiamo il colore di sfondo.
  3. Creiamo un PsDocument a pagina singola con un flusso di output e opzioni di salvataggio già creati.
  4. Creiamo un nuovo stato grafico.
  5. Creiamo una Bitmap dal file immagine.
  6. Applichiamo 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.
  7. Uscire dallo stato grafico corrente e tornare al livello superiore.
  8. Chiudere la pagina.
  9. Salvare il documento.
 1//Create an output stream for PostScript document
 2using (Stream outPsStream = new FileStream(dataDir + "AddTransparentImage_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6    //Set page's background color to see white image on it's own transparent background
 7    options.BackgroundColor = Color.FromArgb(211, 8, 48);
 8
 9    // Create new 1-paged PS Document
10    PsDocument document = new PsDocument(outPsStream, options, false);
11
12
13    document.WriteGraphicsSave();
14    document.Translate(20, 100);
15
16    //Create a bitmap from translucent image file
17    using (Bitmap image = new Bitmap(dataDir + "mask1.png"))
18    {
19        //Add this image to the document as usual opaque RGB image
20        document.DrawImage(image, new Matrix(1, 0, 0, 1, 100, 0), Color.Empty);
21    }
22
23    //Again create a bitmap from the same image file
24    using (Bitmap image = new Bitmap(dataDir + "mask1.png"))
25    {
26        //Add this image to the document as transparent image
27        document.DrawTransparentImage(image, new Matrix(1, 0, 0, 1, 350, 0), 255);
28    }
29
30    document.WriteGraphicsRestore();
31
32    //Close current page
33    document.ClosePage();
34
35    //Save the document
36    document.Save();
37}

Per Linux, macOS e altri sistemi operativi non Windows, offriamo l’utilizzo del nostro pacchetto Nuget Aspose.Page.Drawing. Utilizza il backend Aspose.Drawing invece della libreria di sistema System.Drawing.

Quindi, importate lo spazio dei nomi Aspose.Page.Drawing invece di quello System.Drawing. Nei frammenti di codice sopra e nei seguenti verrà utilizzato Aspose.Page.Drawing.Bitmap al posto di System.Drawing.Bitmap, Aspose.Page.Drawing.Drawing2D.Matrix al posto di System.Drawing.Drawing2D.Matrix e così via. I nostri esempi di codice su GitHub contengono tutte le sostituzioni necessarie.

Vedi come lavorare con la trasparenza in un documento PS in Java.

Il risultato dell’esecuzione di questo codice è il seguente:

Aggiungi immagine trasparente

Aggiunta di un oggetto grafico vettoriale trasparente

In precedenza abbiamo scritto che la libreria Aspose.Page per .NET 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
 2using (Stream outPsStream = new FileStream(dataDir + "ShowPseudoTransparency_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6
 7    // Create new 1-paged PS Document
 8    PsDocument document = new PsDocument(outPsStream, options, false);
 9
10    float offsetX = 50;
11    float offsetY = 100;
12    float width = 200;
13    float height = 100;
14
15///////////////////////////////// Create a rectangle with opaque gradient fill /////////////////////////////////////////////////////////
16    GraphicsPath path = new GraphicsPath();
17    path.AddRectangle(new RectangleF(50, 100, 200, 100));
18
19    LinearGradientBrush opaqueBrush = new LinearGradientBrush(new RectangleF(0, 0, 200, 100), Color.FromArgb(0, 0, 0),
20        Color.FromArgb(40, 128, 70), 0f);
21    Matrix brushTransform = new Matrix(200, 0, 0, 100, 50, 100);
22    opaqueBrush.Transform = brushTransform;
23    Aspose.Page.EPS.GradientBrush gradientBrush = new GradientBrush(opaqueBrush);
24    gradientBrush.WrapMode = WrapMode.Clamp;
25
26    document.SetPaint(gradientBrush);
27    document.Fill(path);
28/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
29
30    offsetX = 350;
31
32///////////////////////////////// Create a rectangle with translucent gradient fill ///////////////////////////////////////////////////
33    //Create graphics path from the first rectangle
34    path = new GraphicsPath();
35    path.AddRectangle(new RectangleF(offsetX, offsetY, width, height));
36
37    //Create linear gradient brush colors which transparency are not 255, but 150 and 50. So it are translucent.
38    LinearGradientBrush translucentBrush = new LinearGradientBrush(new RectangleF(0, 0, width, height), Color.FromArgb(150, 0, 0, 0),
39        Color.FromArgb(50, 40, 128, 70), 0f);
40    //Create a transform for the brush.
41    brushTransform = new Matrix(width, 0, 0, height, offsetX, offsetY);
42    //Set the transform
43    translucentBrush.Transform = brushTransform;
44    
45    //Set the paint
46    document.SetPaint(translucentBrush);
47    //Fill the rectangle
48    document.Fill(path);
49/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
50
51    //Close current page
52    document.ClosePage();
53
54    //Save the document
55    document.Save();
56}

Vedi come lavorare con la trasparenza nei documenti PS in Java e C++.

Il risultato dell’esecuzione di questo codice viene visualizzato come

Mostra pseudo-trasparenza

È possibile scaricare esempi e file di dati da GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.