Trabalhar com Texturas em PostScript | C++
Adicionar Padrão de Textura em Azulejos no Documento PS
Um padrão de textura em azulejos é uma imagem utilizada para preencher ou desenhar objetos: formas ou texto. Se o tamanho da imagem for inferior ao tamanho do objeto, esta será repetida nas direções X e Y para cobrir todas as áreas necessárias.
O processo de repetição da imagem dentro de objetos gráficos é designado por azulejo. Para definir pintura ou traço em PsDocument, devemos passar um objeto da classe System.Drawing.Brush para uma pintura e um objeto da classe System.Drawing.Pen para traçado nos respetivos métodos.
A biblioteca Aspose.Page para C++ processa todas as subclasses de System.Drawing.Brush oferecidas pela plataforma C++. São eles: System.Drawing.SolidBrush, System.Drawing.TextureBrush, System.Drawing.LinearGradientBrush, System.Drawing.PathGradientBrush e System.Drawing.HatchBrush. A classe System.Drawing.Pen não pode ser estendida porque está selada, mas contém System.Drawing.Brush como propriedade e, portanto, a biblioteca Aspose.Page para C++ também pode utilizar um conjunto completo de pincéis para desenhar linhas e contornar formas e texto.
Para pintar objetos gráficos com um padrão texturizado na biblioteca Aspose.Page para C++, basta passar System.Drawing.TextureBrush para SetPaint() ou um dos métodos FillText() ou FillAndStrokeText() que aceitam System.Drawing.Brush como parâmetro.
Para contornar os objetos gráficos com um padrão texturizado na biblioteca Aspose.Page para C++, deve criar um novo System.Drawing.Pen com System.Drawing.TextureBrush e passá-lo para SetStroke() ou um dos métodos OutlineText() ou FillAndStrokeText() que aceitem System.Drawing.Pen como parâmetro.
No exemplo abaixo, demonstramos como preencher uma forma e um texto, e contornar um texto com um padrão de mosaico texturado.
Descrição dos passos de trabalho com o Padrão de Textura e PsDocument no exemplo:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie o objeto PsSaveOptions com as opções padrão.
- Crie um PsDocument de 1 página com um fluxo de saída já criado e guarde as opções.
- Crie um novo estado gráfico e translade-o para a posição necessária.
- Crie System.Drawing.Bitmap a partir do ficheiro de imagem.
- Crie System.Drawing.TextureBrush a partir da imagem.
- Defina a transformação necessária no pincel de textura.
- Defina o pincel de textura como a pintura atual no estado gráfico atual do PsDocument.
- Crie um percurso retangular.
- Preencha o retângulo com o pincel de textura.
- Guarde a pintura atual como uma variável local para utilização futura.
- Defina o traço atual com uma caneta vermelha.
- Contorne o retângulo com uma caneta atual.
- Saia do estado gráfico atual para o estado gráfico de nível superior.
- Crie a fonte system.
- Preencha e trace (contorne) o texto. Para preencher, utilize o pincel de textura e, para traçar, utilize caneta preta.
- Contorne o texto na outra posição com o novo System.Drawing.Pen criado com o pincel de textura como Brush.
- Feche a página.
- Guarde o documento.
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithTextures();
3
4 //Create output stream for PostScript document
5 {
6 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"AddTextureTilingPattern_outPS.ps", System::IO::FileMode::Create);
7 // Clearing resources under 'using' statement
8 System::Details::DisposeGuard<1> __dispose_guard_1({ 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
20 document->WriteGraphicsSave();
21 document->Translate(200.0f, 100.0f);
22
23 //Create a Bitmap object from image file
24 {
25 System::SharedPtr<System::Drawing::Bitmap> image = System::MakeObject<System::Drawing::Bitmap>(dataDir + u"TestTexture.bmp");
26 // Clearing resources under 'using' statement
27 System::Details::DisposeGuard<1> __dispose_guard_0({ image});
28 // ------------------------------------------
29
30 try
31 {
32 //Create texture brush from the image
33 System::SharedPtr<System::Drawing::TextureBrush> brush = System::MakeObject<System::Drawing::TextureBrush>(image, System::Drawing::Drawing2D::WrapMode::Tile);
34
35 //Add scaling in X direction to the mattern
36 System::SharedPtr<System::Drawing::Drawing2D::Matrix> transform = System::MakeObject<System::Drawing::Drawing2D::Matrix>(2.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
37 brush->set_Transform(transform);
38
39 //Set this texture brush as current paint
40 document->SetPaint(brush);
41 }
42 catch(...)
43 {
44 __dispose_guard_0.SetCurrentException(std::current_exception());
45 }
46 }
47
48 //Create rectangle path
49 System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
50 path->AddRectangle(System::Drawing::RectangleF(0.0f, 0.0f, 200.0f, 100.0f));
51
52 //Fill rectangle
53 document->Fill(path);
54
55 //Get current paint
56 System::SharedPtr<System::Drawing::Brush> paint = document->GetPaint();
57
58 //Set red stroke
59 document->SetStroke(System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Red()), 2.0f));
60 //Stroke the rectangle
61 document->Draw(path);
62
63 document->WriteGraphicsRestore();
64
65 //Fill text with texture pattern
66 System::SharedPtr<System::Drawing::Font> font = System::MakeObject<System::Drawing::Font>(u"Arial", 96.0f, System::Drawing::FontStyle::Bold);
67 document->FillAndStrokeText(u"ABC", font, 200.0f, 300.0f, paint, System::MakeObject<System::Drawing::Pen>(System::Drawing::Color::get_Black(), 2.0f));
68
69 //Outline text with texture pattern
70 document->OutlineText(u"ABC", font, 200.0f, 400.0f, System::MakeObject<System::Drawing::Pen>(paint, 5.0f));
71
72 //Close current page
73 document->ClosePage();
74
75 //Save the document
76 document->Save();
77 }
78 catch(...)
79 {
80 __dispose_guard_1.SetCurrentException(std::current_exception());
81 }
82 }
O resultado da execução deste código é apresentado como
Pode descarregar exemplos e ficheiros de dados do GitHub.