Сохраняем SVG из Delphi / C++ Builder / Lazarus

13.08.2020

SVG - этот формат представляет из себя двумерное векторное изображение на основе документов в формате XML.

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

Давайте перечислим основные преимущества формата SVG:

Во-первых, как ранее оговаривалось в прошлой статье, векторная графика по определению масштабируется без потерь в любой размер (и при увеличении изображение не будет превращаться в картинку художника-кубиста).

Во-вторых, SVG полностью совместим с веб-технологиями и поэтому будет органичной частью сайтов.

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

В-четвертых, SVG – текстовый формат, поэтому можно оптимизировать файл под SEO без внешних мета-тегов, прямо вписывая ключевые слова в код изображения.

Есть и минусы данного формата:

  1. Вес файла будет увеличиваться с немалой скоростью, как снежная лавина при увеличении детализации изображений. Однако для картинок с кучей деталей лучше всего использовать PNG или JPG.
    Так что, к сожалению, SVG совершенно не годится для реалистичных фотографий высокого разрешения и подробных карт местности.
  2. SVG не поддерживается старыми браузерами (Internet Explorer 8 и более старшие версии), но не думаю, что это слишком большой минус.
  3. По умолчанию, например, WordPress не позволяет загружать SVG-файлы, из-за проблем с  безопасностью. WordPress воспринимает это разрешение как что-то вредоносное, а поэтому блокирует отображение. Но блокировку возможно обойти с помощью плагинов.
  4. Подходит для создания несложных объектов, которые могут быть описаны простыми фигурами или их частями.
  5. Стоит упомянуть о том, что социальные сети, такие как Facebook и Twitter, не поддерживают SVG для шаринга. Если вы используете SVG-файлы в качестве разных миниатюр, вам придется использовать плагин и задать PNG или JPG для мета-тегов.

Основные преимущества и недостатки SVG-формата мы рассмотрели, а теперь вернемся к основной теме статьи.

Как сохранить SVG-файл на Delphi или Lazarus?

Для начала надо бы создать то самое изображение!
И вот тут могу посоветовать (внезапно) FastReport VCL, оттуда можно сохранить сразу в нужный нам формат из Delphi. Ведь элементами могут быть не только картинки, объектов для отображения довольно-таки много. Удобно, ну, а почему бы и нет?) Начиная от штрих-кодов, заканчивая таблицами и картами - а вот их сохранять в векторный формат прямо категорически рекомендуется!

Следовательно, начнем!

Создаем отчет. Посмотрели перед сохранением, что-то не понравилось? Изменили, отредактировали!

Теперь, после того, как создали то, что требовалось - запускаем и смотрим, что получилось.


Вызываем предпросмотр и далее выбираем формат, который нам нужен.
Вот он - внизу!
Выбираем и нажимаем.

Теперь мы видим окно, где много разных настроек. Настроили все нужные нам критерии и нажали “ОК”!

Немного о настройках при экспорте

Можно отметить, что при сохранении в SVG формат вариантов настройки объекта иные, нежели при BMP, JPEG, TIFF или GIF. 

More precisely, such functions as:

Styles – сохранение стилей;
Unified Pictures – стандартизация изображений;
Formatted – форматирование;
Pictures – сохранение документа с картинками - это выбор формата для тех изображений, которые в наш документ попали уже будучи пиксельными; 
Multi Page – многостраничность документа;
Page navigator – навигатор страниц;
Сохранение графических изображений в PNG, EMF, BMP, JPEG форматах.

Ну, а настройки форматов BMP, JPEG, TIFF, GIF это:

Monochrome – изображения в оттенках черного;
Crop pages – обрезка страниц;
JPEG quality – качество графического объекта;
Resultion (dip) – разрешение.

Очевидно, что векторное изображение при сохранении в растровые форматы будет растрировано, а вот наоборот (растр в вектор) - не произойдёт.

Единственное, что похоже у всех этих форматов - это настройки по действиям со страницами документа, возможность сохранения, ну и автоматическое открытие документа сразу же после сохранения.

Рассмотрев, как можно сохранить с помощью консоли окна предварительного просмотра перейдем к варианту сохранения без предпросмотра.

Сохранение SVG из кода Delphi / C++Builder / Lazarus.

Экспорт в SVG
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TForm1.Button1Click(Sender: TObject);
begin
 {Формируем отчёт. Перед экспортом отчёт необходимо обязательно сформировать}
 frxReport1.PrepareReport();
 {Устанавливаем диапазон экспортируемых страниц. По умолчанию экспортируются все страницы сформированного отчёта}
 frxSVGExport1.PageNumbers := '2-3';
 {Устанавливаем, нужно ли экспортировать стили объектов}
 frxSVGExport1.EmbeddedCSS := True;
 {Устанавливаем, нужно ли конвертировать все изображения в соответствии с PictureFormat:}
 {если изображение в отчёте в формате BMP, а PictureFormat - PNG, то BMP будет сохранён в формате PNG}
 frxSVGExport1.UnifiedPictures := True;
 {Устанавливаем, нужно ли форматировать исходный текст SVG (увеличивает размер результирующего файла) }
 frxSVGExport1.Formatted := False;
 {Устанавливаем, нужно ли экспортировать изображения}
 frxSVGExport1.EmbeddedPictures := True;
 {Устанавливаем, нужно ли экспортировать каждую страницу в отдельный SVG файл}
 frxSVGExport1.Multipage := False;
 {Устанавливаем, нужно ли добавлять кнопки навигации в результирующий SVG файл}
 frxSVGExport1.Navigation := False;
 {Устанавливаем, в каком формате экспортировать изображения}
 //uses frxExportHelpers;
 // TfrxPictureFormat = (pfPNG, {$IFNDEF FPC}pfEMF,{$ENDIF} pfBMP, pfJPG);)
 frxSVGExport1.PictureFormat := pfPNG;
 {Устанавливаем, нужно ли открывать результирующий файл после экспорта}
 frxSVGExport1.OpenAfterExport := False;
 {Устанавливаем, нужно ли отображать прогресс экспорта
  (показывать, какая страница в данный момент экспортируется)}
 frxSVGExport1.ShowProgress := False;
 {Устанавливаем, нужно ли отображать окно диалога с настройками фильтра экспорта}
 frxSVGExport1.ShowDialog := False;
 {Устанавливаем имя результирующего файла.}
 {Обратите внимание на то, что если не установить имя файла и отключить показ диалогового окна фильтра экспорта,}
 {то всё равно будет отображён диалог выбора имени файла}
 frxSVGExport1.FileName := 'C:\Output\test.svg';
 {Экспортируем отчёт}
 frxReport1.Export(frxSVGExport1);
end;

Давайте проведем сравнение между результатами экспорта растровых и векторных объектов!

Ниже предоставлю примеры изображений - JPEG и SVG.

JPEG

SVG

И.. тут мы сразу видим разницу. Какую же?)
Ну, к примеру, растровое изображение имеет больший размер нежели векторное, а при масштабировании пропадает четкость. А вот у векторного изображения(SVG) при приближении четкость никуда не пропадет, да и вес значительно меньше будет. Единственный недостаток - не подходит SVG для реалистичных фото (но их у нас и нет).

А теперь подведем итоги! Векторный формат SVG - очень удобен (если использовать его в нужном месте), а сохранение через FastReport VCL - делает такое сохранение ещё и простым.

1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.
28 октября 2024

Как настроить WSL 2 для работы с FastReport и FastCube

В этой статье попробуем вместе разобраться, как настроить WSL 2 для работы с компонентами FastReport и FastCube в Lazarus для Linux.