Добавить прозрачность сетки градиента XPS

Файлы XPS можно использовать для отображения большого количества визуальной информации. Они поддерживают текст, изображения, прозрачность объектов, сетки, градиенты и многие другие функции. Вы можете вставлять градиент, сетку и прозрачные объекты в файлы XPS в соответствии с вашими требованиями. В этой статье мы подробно рассмотрим эти функции, а также различные примеры и варианты использования. Пройдемся по следующим темам:

Установка XPS API для C++

Вы можете быстро и легко настроить API Aspose.Page for C++ в своих приложениях для программирования для работы с XPS, PS, EPS и другими поддерживаемыми форматами файлов. Просто загрузите файл DLL из официального Загрузки или установите его из галереи NuGet с помощью следующей команды:

PM> Install-Package Aspose.Page.Cpp 

Добавление градиента в файл XPS с помощью C++

Иногда вам нужно добавить градиент в файлы XPS. Вы можете манипулировать файлом XPS, поскольку API позволяет добавлять линейный, горизонтальный и вертикальный градиент. Давайте добавим следующие градиенты в файл XPS:

Добавить вертикальный градиент в файл XPS с помощью С++

Вы можете легко добавить вертикальный градиент в файлы XPS с помощью нескольких простых вызовов API. Ниже приведены шаги для добавления вертикального градиента:

  1. Создайте новый XPS-документ
  2. Инициализировать список XpsGradientStop
  3. Создайте новый путь, определив геометрию
  4. Сохраните полученный XPS-документ

Приведенный ниже код основан на этих шагах и демонстрирует, как добавить вертикальный градиент в XPS-файл с помощью C++.

// Создать новый XPS-документ
auto doc = System::MakeObject<XpsDocument>();

// Инициализировать список XpsGradientStop
auto stops = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>>();
stops->Add(doc->CreateGradientStop(doc->CreateColor(253, 255, 12, 0), 0.f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(252, 255, 154, 0), 0.359375f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(252, 255, 56, 0), 0.424805f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(253, 255, 229, 0), 0.879883f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(252, 255, 255, 234), 1.f));

// Создайте новый путь, определив геометрию в форме аббревиатуры.
System::SharedPtr<XpsPath> path = doc->AddPath(doc->CreatePathGeometry(u"M 10,110 L 228,110 228,200 10,200"));
path->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 20.f, 70.f));
path->set_Fill(doc->CreateLinearGradientBrush(System::Drawing::PointF(10.f, 110.f), System::Drawing::PointF(10.f, 200.f)));
(System::DynamicCast<Aspose::Page::Xps::XpsModel::XpsGradientBrush>(path->get_Fill()))->get_GradientStops()->AddRange(stops);

// Сохраните полученный XPS-документ
doc->Save(RunExamples::outDir() + u"AddVerticalGradient_out.xps");

Добавить горизонтальный градиент в XPS с помощью C++

Другой возможный вариант градиента в XPS-файлах — горизонтальный градиент. Подход с добавлением горизонтального градиента немного связан с вариантом использования, который мы обсуждали выше. Ниже приведены шаги, которые необходимо выполнить для добавления горизонтального градиента:

  1. Создать новый XPS-документ
  2. Укажите остановки градиента с помощью XpsGradientStop.
  3. Создать путь с геометрией
  4. Сохранить выходной XPS-документ

В следующем фрагменте кода показано, как добавить горизонтальный градиент в XPS-файлы с помощью C++:

// Создать новый XPS-документ
auto doc = System::MakeObject<XpsDocument>();

// Инициализировать список XpsGradientStop
System::SharedPtr<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>> stops = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>>();
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 244, 253, 225), 0.0673828f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 251, 240, 23), 0.314453f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 252, 209, 0), 0.482422f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 241, 254, 161), 0.634766f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 53, 253, 255), 0.915039f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 12, 91, 248), 1.f));

// Создайте новый путь, определив геометрию в форме аббревиатуры.
System::SharedPtr<XpsPath> path = doc->AddPath(doc->CreatePathGeometry(u"M 10,210 L 228,210 228,300 10,300"));
path->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 20.f, 70.f));
path->set_Fill(doc->CreateLinearGradientBrush(System::Drawing::PointF(10.f, 0.f), System::Drawing::PointF(228.f, 0.f)));
(System::DynamicCast<Aspose::Page::Xps::XpsModel::XpsGradientBrush>(path->get_Fill()))->get_GradientStops()->AddRange(stops);

// Сохраните полученный XPS-документ
doc->Save(RunExamples::outDir() + u"AddHorizontalGradient_out.xps");

Вставьте сетку в файл XPS с помощью C++

Aspose.Page for C++ API позволяет отображать сетки в файлах XPS с множеством свойств для управления визуализацией. Давайте рассмотрим пример вставки сетки в файл XPS в ваших приложениях на C++. Вы можете работать с этой функцией, выполнив следующие шаги:

  1. Инициализировать объект класса XpsDocument
  2. Укажите геометрию для сетки VisualBrush
  3. Создайте Canvas для пурпурной сетки VisualBrush
  4. Создайте визуальную кисть и добавьте сетку
  5. Сохранить выходной файл XPS

Приведенный ниже код основан на этих шагах, которые объясняют, как вставить сетку в файлы XPS с помощью C++:

auto doc = System::MakeObject<XpsDocument>();

// Геометрия для пурпурной сетки VisualBrush
System::SharedPtr<XpsPathGeometry> pathGeometry = doc->CreatePathGeometry();
pathGeometry->AddSegment(doc->CreatePolyLineSegment(System::MakeArray<System::Drawing::PointF>({ System::Drawing::PointF(240.f, 5.f), System::Drawing::PointF(240.f, 310.f), System::Drawing::PointF(0.f, 310.f) })));
pathGeometry->idx_get(0)->set_StartPoint(System::Drawing::PointF(0.f, 5.f));

// Холст для пурпурной сетки VisualBrush
System::SharedPtr<XpsCanvas> visualCanvas = doc->CreateCanvas();

System::SharedPtr<XpsPath> visualPath = visualCanvas->AddPath(doc->CreatePathGeometry(u"M 0,4 L 4,4 4,0 6,0 6,4 10,4 10,6 6,6 6,10 4,10 4,6 0,6 Z"));
visualPath->set_Fill(doc->CreateSolidColorBrush(doc->CreateColor(1.f, .61f, 0.1f, 0.61f)));

System::SharedPtr<XpsPath> gridPath = doc->CreatePath(pathGeometry);

//Создадим визуальную кисть, задаваемую некоторым фрагментом XPS (векторную графику и глифы)
gridPath->set_Fill(doc->CreateVisualBrush(visualCanvas, System::Drawing::RectangleF(0.f, 0.f, 10.f, 10.f), System::Drawing::RectangleF(0.f, 0.f, 10.f, 10.f)));
(System::DynamicCast<Aspose::Page::Xps::XpsModel::XpsVisualBrush>(gridPath->get_Fill()))->set_TileMode(Aspose::Page::Xps::XpsModel::XpsTileMode::Tile);

// Новый холст
System::SharedPtr<XpsCanvas> canvas = doc->AddCanvas();
canvas->set_RenderTransform(doc->CreateMatrix(1.f, 0.f, 0.f, 1.f, 268.f, 70.f));

// Добавить сетку
canvas->AddPath(gridPath);

// Красный прозрачный прямоугольник посередине вверху
System::SharedPtr<XpsPath> path = canvas->AddPath(doc->CreatePathGeometry(u"M 30,20 l 258.24,0 0,56.64 -258.24,0 Z"));
path = canvas->AddPath(doc->CreatePathGeometry(u"M 10,10 L 228,10 228,100 10,100"));
path->set_Fill(doc->CreateSolidColorBrush(doc->CreateColor(1.0f, 0.0f, 0.0f)));
path->set_Opacity(0.7f);

// Сохраните полученный XPS-документ
doc->Save(RunExamples::outDir() + u"AddGrid_out.xps");

Вставьте прозрачный объект в файл XPS с помощью С++

Еще одна интересная функция для работы с XPS-файлами — поддержка прозрачности и непрозрачности. Вам может потребоваться добавить прозрачные объекты в XPS-файл в различных сценариях. Этого можно достичь с помощью следующих шагов:

  1. Создать новый XPS-документ
  2. Создать путь с геометрией замкнутого прямоугольника
  3. Добавить геометрию для разных путей
  4. Сохранить выходной XPS-документ

За этими шагами следует следующий код, демонстрирующий, как добавить прозрачный объект в файл XPS с помощью языка программирования C++:

// Создать новый XPS-документ
auto doc = System::MakeObject<XpsDocument>();

// Просто для демонстрации прозрачности
doc->AddPath(doc->CreatePathGeometry(u"M120,0 H400 v1000 H120"))->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Gray()));
doc->AddPath(doc->CreatePathGeometry(u"M300,120 h600 V420 h-600"))->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Gray()));

// Создать путь с геометрией замкнутого прямоугольника
System::SharedPtr<XpsPath> path1 = doc->CreatePath(doc->CreatePathGeometry(u"M20,20 h200 v200 h-200 z"));
// Установите синюю сплошную кисть для заполнения path1
path1->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Blue()));
// Добавить на текущую страницу
System::SharedPtr<XpsPath> path2 = doc->Add(path1);

// path1 и path2 совпадают, если path1 не помещен внутрь какого-либо другого элемента
// (что означает, что у path1 не было родительского элемента).
// Из-за того, что цвет этого прямоугольника на странице фактически становится зеленым
path2->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Green()));

// Теперь добавьте path2 еще раз. Теперь path2 имеет родителя. Таким образом, path3 не будет таким же, как path2.
// Таким образом, на странице рисуется новый прямоугольник...
System::SharedPtr<XpsPath> path3 = doc->Add(path2);
// ...и сдвигаем его на 300 единиц ниже...
path3->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 300.0f));
// ... и установите красную сплошную кисть, чтобы заполнить его
path3->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Red()));

// Создайте новый путь4 с геометрией пути2...
System::SharedPtr<XpsPath> path4 = doc->AddPath(path2->get_Data());
// ... сдвинем его на 300 единиц вправо...
path4->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 300.0f, 0.0f));
// ... и установите синюю сплошную заливку
path4->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Blue()));

// Добавьте path4 еще раз.
System::SharedPtr<XpsPath> path5 = doc->Add(path4);
// path4 и path5 опять не совпадают...
// (переместить path5 на 300 единиц ниже)
path5->set_RenderTransform(path5->get_RenderTransform()->Clone());
// чтобы отключить значение RenderTransform от path4 (см. следующий комментарий о свойстве Fill)
path5->get_RenderTransform()->Translate(0.0f, 300.0f);
// ... но если мы установим непрозрачность свойства Fill, это повлияет как на path5, так и на path4
// потому что кисть — это комплексное значение свойства, которое остается одинаковым для path5 и path4.
path5->get_Fill()->set_Opacity(0.8f);

// Создайте новый path6 с геометрией path2...
System::SharedPtr<XpsPath> path6 = doc->AddPath(path2->get_Data());
// ... сдвинем его на 600 единиц вправо...
path6->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 600.0f, 0.0f));
// ... и установите желтую сплошную заливку
path6->set_Fill(doc->CreateSolidColorBrush(System::Drawing::Color::get_Yellow()));

// Теперь добавьте клон path6...
System::SharedPtr<XpsPath> path7 = doc->Add(path6->Clone());
// (переместить path5 на 300 единиц ниже)
path7->set_RenderTransform(path7->get_RenderTransform()->Clone());
path7->get_RenderTransform()->Translate(0.0f, 300.0f);
// ... и установить непрозрачность для path7
path7->get_Fill()->set_Opacity(0.8f);
// Теперь непрозрачность влияет независимо, как только значения свойств клонируются вместе с элементом.

// Следующий блок кода эквивалентен предыдущему.
// Добавьте сам path6. путь6 и путь7 не совпадают. Хотя их значения свойства Fill одинаковы 
//XPSPath path7 = doc.Add(path6);
//path7.RenderTransform = path7.RenderTransform.Clone();
//path7.RenderTransform.Translate(0, 300);
// Чтобы «отключить» свойство Fill пути 7 от свойства Fill пути 6, переназначьте его своему клону (или клону заполнения пути 6).
//path7.Fill = ((XpsSolidColorBrush)path7.Fill).Clone();
//path7.Fill.Opacity = 0,8f;

// Сохраните полученный XPS-документ
doc->Save(RunExamples::outDir() + u"WorkingWithTransparency_out.xps");

Вывод

Короче говоря, мы изучили ряд функций для работы с файлами XPS. Вы можете добавить градиент, линейный, горизонтальный или вертикальный, а также сетки или прозрачные объекты в файлы XPS. Кроме того, вы можете ознакомиться с некоторыми другими функциями, загрузив [Проект примеров]]5. В случае возникновения каких-либо неясностей, пожалуйста, напишите нам на Форумы бесплатной поддержки. Мы будем иметь честь направлять вас!

Смотрите также