Arbeiten mit Transparenz in PostScript | C++
Fügen Sie Transparenz im PS-Dokument hinzu
PostScript unterstützt keine Transparenz beim Malen von Vektorgrafikobjekten. Durchscheinende (teilweise transparente) Bilder können jedoch als Satz vollständig transparenter und vollständig undurchsichtiger Pixel gerendert werden. Solche Bilder werden Masken genannt.
Die Aspose.Page for C++-Bibliothek bietet eine Methode, die das transparente Bild zum PS-Dokument hinzufügt. Für das Malen von Vektorgrafiken: Formen oder Text bieten wir „Pseudotransparenz“ an.
„Pseudotransparenz“ ist ein Prozess zum Verblassen von Farben, die eine Alpha-Komponente von weniger als 255 haben. Dies wird durch die spezifische Mischung der Rot-, Grün- und Blau-Komponenten mit Alpha eins erreicht.
„Pseudotransparenz“ ermöglicht es uns natürlich nicht, die untere farbige Schicht unter der oberen transparenten Schicht zu sehen, erzeugt aber eine Illusion von Transparenz, wenn die untere Schicht weiß ist.
Transparentes Bild im PS-Dokument hinzufügen
Wie wir zuvor geschrieben haben, können transparente Bilder als Maske zum PS-Dokument hinzugefügt werden, und die Bibliothek Aspose.Page für C++ bietet zu diesem Zweck eine Methode AddTransparentImage(). Diese Methode erkennt, ob das Bild vollständig undurchsichtig oder vollständig transparent bzw. durchscheinend ist. Wenn es vollständig undurchsichtig ist, wird es in der Methode AddImage() als undurchsichtiges Bild hinzugefügt. Wenn es vollständig transparent ist, wird es dem Dokument überhaupt nicht hinzugefügt. Wenn es sich um ein durchscheinendes Bild handelt, wird es als PostScript-Bild hinzugefügt Maske.
Im folgenden Beispiel demonstrieren wir den Unterschied zwischen dem Hinzufügen eines transparenten Bildes in einem PS-Dokument mit AddImage() und AddTransparentImage(). Um das weiße, durchscheinende Bild zu sehen, stellen wir die Hintergrundfarbe der Seite auf nicht weiß ein.
Um in diesem Beispiel ein beliebiges Bild zu einem neuen PsDocument mit der Aspose.Page für C++-Bibliothek hinzuzufügen, führen wir die folgenden Schritte aus:
- Erstellen Sie einen Ausgabestream für die resultierende PS-Datei.
- Erstellen Sie ein PsSaveOptions-Objekt mit Standardoptionen. Ändern Sie bei Bedarf die Hintergrundfarbe.
- Erstellen Sie ein einseitiges PsDocument mit einem bereits erstellten Ausgabestream und Speicheroptionen.
- Erstellen Sie einen neuen Grafikstatus.
- Erstellen Sie eine Bitmap aus der Bilddatei.
- Erstellen Sie die erforderliche Transformation für das Bild.
- Fügen Sie das Bild als vollständig undurchsichtiges Bild zu PsDocument hinzu (mit der Methode AddImage()), wenn wir sicher sind, dass das Bild undurchsichtig ist, oder fügen Sie eines als transparentes Bild hinzu (mit der Methode AddTransparentImage()). wenn wir nicht sicher sind, ob das Bild undurchsichtig ist.
- Verlassen Sie den aktuellen Grafikstatus zur oberen Ebene eins.
- Schließen Sie die Seite.
- Speichern Sie das Dokument.
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithTransparency();
3
4 //Create output stream for PostScript document
5 {
6 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"AddTransparentImage_outPS.ps", System::IO::FileMode::Create);
7 // Clearing resources under 'using' statement
8 System::Details::DisposeGuard<1> __dispose_guard_2({ outPsStream});
9 // ------------------------------------------
10
11 try
12 {
13 //Create save options with A4 size
14 System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
15 //Set page's background color to see white image on it's own transparent background
16 options->set_BackgroundColor(System::Drawing::Color::FromArgb(211, 8, 48));
17
18 // Create new 1-paged PS Document
19 System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
20
21
22 document->WriteGraphicsSave();
23 document->Translate(20.0f, 100.0f);
24
25 //Create bitmap from translucent image file
26 {
27 System::SharedPtr<System::Drawing::Bitmap> image = System::MakeObject<System::Drawing::Bitmap>(dataDir + u"mask1.png");
28 // Clearing resources under 'using' statement
29 System::Details::DisposeGuard<1> __dispose_guard_0({ image});
30 // ------------------------------------------
31
32 try
33 {
34 //Add this image to document as usual opaque RGB image
35 document->DrawImage(image, System::MakeObject<System::Drawing::Drawing2D::Matrix>(1.0f, 0.0f, 0.0f, 1.0f, 100.0f, 0.0f), System::Drawing::Color::Empty);
36 }
37 catch(...)
38 {
39 __dispose_guard_0.SetCurrentException(std::current_exception());
40 }
41 }
42
43 //Again create bitmap from the same image file
44 {
45 System::SharedPtr<System::Drawing::Bitmap> image = System::MakeObject<System::Drawing::Bitmap>(dataDir + u"mask1.png");
46 // Clearing resources under 'using' statement
47 System::Details::DisposeGuard<1> __dispose_guard_1({ image});
48 // ------------------------------------------
49
50 try
51 {
52 //Add this image to document as transparent image image
53 document->DrawTransparentImage(image, System::MakeObject<System::Drawing::Drawing2D::Matrix>(1.0f, 0.0f, 0.0f, 1.0f, 350.0f, 0.0f), 255);
54 }
55 catch(...)
56 {
57 __dispose_guard_1.SetCurrentException(std::current_exception());
58 }
59 }
60
61 document->WriteGraphicsRestore();
62
63 //Close current page
64 document->ClosePage();
65
66 //Save the document
67 document->Save();
68 }
69 catch(...)
70 {
71 __dispose_guard_2.SetCurrentException(std::current_exception());
72 }
73 }
Weitere Informationen finden Sie unter „Arbeiten mit Transparenz in PS-Dokumenten“ in .NET oder Java.
Das Ergebnis der Ausführung dieses Codes ist das nächste
Hinzufügen eines transparenten Vektorgrafikobjekts
Zuvor haben wir geschrieben, dass die Aspose.Page for C++-Bibliothek einen Paling-Algorithmus für transparente Formen und Text verwendet, den wir „Pseudotransparenz“ nannten. Im folgenden Beispiel zeigen wir einen Unterschied zwischen zwei Formen, die mit derselben Farbe bemalt sind, jedoch in der ersten Form ohne die Alpha-Komponente und im zweiten Fall mit der Alpha-Komponente.
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithTransparency();
3
4 //Create output stream for PostScript document
5 {
6 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"ShowPseudoTransparency_outPS.ps", System::IO::FileMode::Create);
7 // Clearing resources under 'using' statement
8 System::Details::DisposeGuard<1> __dispose_guard_0({ outPsStream});
9 // ------------------------------------------
10
11 try
12 {
13 //Create save options with A4 size
14 System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
15
16 // Create new 1-paged PS Document
17 System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
18
19 float offsetX = 50.0f;
20 float offsetY = 100.0f;
21 float width = 200.0f;
22 float height = 100.0f;
23
24 ///////////////////////////////// Create rectangle with opaque gradient fill /////////////////////////////////////////////////////////
25 System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
26 path->AddRectangle(System::Drawing::RectangleF(offsetX, offsetY, width, height));
27
28 System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> opaqueBrush = System::MakeObject<System::Drawing::Drawing2D::LinearGradientBrush>(System::Drawing::RectangleF(0.0f, 0.0f, 200.0f, 100.0f), System::Drawing::Color::FromArgb(0, 0, 0), System::Drawing::Color::FromArgb(40, 128, 70), 0.f);
29 System::SharedPtr<System::Drawing::Drawing2D::Matrix> brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
30 opaqueBrush->set_Transform(brushTransform);
31 System::SharedPtr<GradientBrush> gradientBrush = System::MakeObject<GradientBrush>(opaqueBrush);
32 gradientBrush->set_WrapMode(System::Drawing::Drawing2D::WrapMode::Clamp);
33
34 document->SetPaint(gradientBrush);
35 document->Fill(path);
36 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
37
38 offsetX = 350.0f;
39
40 ///////////////////////////////// Create rectangle with translucent gradient fill ///////////////////////////////////////////////////
41 //Create graphics path from the first rectangle
42 path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
43 path->AddRectangle(System::Drawing::RectangleF(offsetX, offsetY, width, height));
44
45 //Create linear gradient brush colors which transparency are not 255, but 150 and 50. So it are translucent.
46 System::SharedPtr<System::Drawing::Drawing2D::LinearGradientBrush> translucentBrush = System::MakeObject<System::Drawing::Drawing2D::LinearGradientBrush>(System::Drawing::RectangleF(0.0f, 0.0f, width, height), System::Drawing::Color::FromArgb(150, 0, 0, 0), System::Drawing::Color::FromArgb(50, 40, 128, 70), 0.f);
47 //Create a transform for brush.
48 brushTransform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(width, 0.0f, 0.0f, height, offsetX, offsetY);
49 //Set transform
50 translucentBrush->set_Transform(brushTransform);
51 //Create GradientBrush object containing the linear gradient brush
52 gradientBrush = System::MakeObject<GradientBrush>(translucentBrush);
53 gradientBrush->set_WrapMode(System::Drawing::Drawing2D::WrapMode::Clamp);
54 //Set paint
55 document->SetPaint(gradientBrush);
56 //Fill the rectangle
57 document->Fill(path);
58 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
59
60 //Close current page
61 document->ClosePage();
62
63 //Save the document
64 document->Save();
65 }
66 catch(...)
67 {
68 __dispose_guard_0.SetCurrentException(std::current_exception());
69 }
70 }
Weitere Informationen finden Sie unter „Arbeiten mit Transparenz in PS-Dokumenten“ in .NET oder Java.
Das Ergebnis der Ausführung dieses Codes wird wie folgt angezeigt:
Sie können Beispiele und Datendateien herunterladen von GitHub.