Рисование векторных картинок в формате WMF средствами 1С8 без внешних компонент

12.11.14

Разработка - Разработка внешних компонент

Набор процедур для создания векторных картинок в формате WMF.
Векторные картинки хорошо масштабируются, в первую очередь при печати.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
РисованиеВекторнойКартинки.epf
.epf 16,40Kb
47
47 Скачать (1 SM) Купить за 1 850 руб.

Данная обработка содержит набор методов для создания векторных картинок в формате WMF.

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

Данная реализация содержит не все команды. Я не включал команды работы с палитрой (за неактуальностью) и с регионами (из-за определенной бедности и муторности по сравнению с WinAPI). Некоторые команды или параметры команд не поддерживаются приложениями. В частности, мне не удалось указать межсимвольный интервал или задать поворот символов относительно оси рисования. При желании можно добавить любую команду, вооружившись описанием формата - официальное описание тут: http://msdn.microsoft.com/en-us/library/cc250370.aspx
Стоит учитывать что почти все параметры задаются 16-разрядными словами.

 Сразу предупреждаю - не следует полагаться на "умолчания" - тестовая картинка в 1С, ACDSee и WinWord выглядела по-разному пока все возможные параметры не были уточнены.

Система координат по умолчанию - влево и вниз. Создаваемая картинка предполагает что отсчет начинается с 0,0. Единицы измерения достаточно условны, особенно с учетом что картинка может масштабироваться. В создаваемой картинке я указываю рекомендуемую плотность 1440 точек на дюйм (стандартное разрешение), что при стандартном отношении 96 точек/дюйм для экрана даст 15 WMF-точек на пиксель.

Для рисования требуется создавать объекты PEN ("ручка","карандаш") - для линий, BRUSH ("кисть") - для закрашивания, FONT - шрифт. При создании ручки и кисти указывается их цвет и узор. Для описания шрифта я использую стандартный объект "Шрифт". Свойство "Размер" указывает на высоту шрифта в условных единицах. Можно заранее создать несколько кистей и других объектов, по мере необходимости подключая нужную функцией SelectObject(). Функции создания объектов возвращают номер, который требуется использовать в функции ВекторнаяКартинкаSelectObject()

Все замкнутые фигуры рисуют границу стилем PEN и заливаются стилем BRUSH. Если выбран стиль кисти Штриховка, то указывается СтильШтриховки. Следует ли затирать то что находится под текстом или штриховой заливкой и как, регулируется функциями фона: SETBKMODE, SETBKCOLOR.

Текст выводится в кодировке Win-1251, перекодирую из строки автоматически. Так же для TEXTOUT можно указать в качестве параметра "текст" массив байт-кодов символов.

Основные используемые константы я вынес в Структуры: СтильКарандаш для создания PEN, СтильКисть и СтильШтриховки для создания BRUSH, ВыводТекста, ВыравниваниеТекста и ВыводФона для отображения текста.

Для указания цветов я использую объект Цвет, заданный цветовыми компонентами (Абсолютный)

Можно вставить растровую картинку с изменением пропорций (последняя функция).

Для начала работы требуется создать объект с указанием планируемой ширины и высоты в условных единицах функцией
Функция СоздатьВекторнуюКартинку(Ширина,Высота) Экспорт

После формирования картинки её можно вывести в ДвоичныйПоток:
Функция ВекторнаяКартинкаСохранитьВДанные(картинка) Экспорт
В файл:
Процедура ВекторнаяКартинкаСохранитьВФайл(картинка,ИмяФайла) Экспорт
Для получения системного объекта Картинка требуется:
поток=ВекторнаяКартинкаСохранитьВДанные(к);
Картинка1=Новый Картинка(поток);

Создание объектов:

//Создать объект PEN для рисования линий
Функция ВекторнаяКартинкаCREATEPENINDIRECT(картинка,Стиль,Толщина,Цвет) Экспорт
//Создать объект BRUSH для заливки
Функция ВекторнаяКартинкаCREATEBRUSHINDIRECT(картинка,Стиль,знач Цвет=Неопределено,знач Штриховка=0) Экспорт
//Создание объекта "Шрифт" в картинке
//@шрифт - объект Шрифт
//@Ширина - подбор ширины символов, 0 - авто
//@Поворот - угол наклона шрифта в градусах
//@ПоворотЗнаков - угол наклона символов. По умолчанию совпадает с наклоном шрифта
//@Кодировка - значение CharSet из стандарта WMF. 0 - Ansi, 1 - по умолчанию, 204 - русский
//@Подбор - значение OutPrecision Enumeration
//@ПодборОбрезания - значение ClipPrecision Flags
//@Качество - значение FontQuality Enumeration
//@Семейство - значение PitchAndFamily = FamilyFont + PitchFont*64
Функция ВекторнаяКартинкаCREATEFONTINDIRECT(картинка,шрифт,Ширина=0,Поворот=0,знач ПоворотЗнаков=Неопределено,Кодировка=1,Подбор=0,ПодборОбрезания=0,Качество=0,Семейство=0) Экспорт

Функции рисования:

//Рисование прямоугольника с заливкой
Процедура ВекторнаяКартинкаRECTANGLE(картинка,х1,у1,х2,у2) Экспорт
//Рисование прямоугольника с заливкой с закругленными краями, ширина и высота задают степень скругления
Процедура ВекторнаяКартинкаROUNDRECT(картинка,х1,у1,х2,у2,ширина,высота) Экспорт
//Рисует дугу эллипса выбранным PEN, дуга задается пересечением эллипса,
//заданного описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
//и пересекающими его отрезками из центра к точкам (ОХ1,ОУ1) и (ОХ2,ОУ2)
Процедура ВекторнаяКартинкаARC(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2,ОХ1,ОУ1,ОХ2,ОУ2) Экспорт
//Рисует усеченный эллипс с заливкой, дуга задается пересечением эллипса,
//заданного описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
//и пересекающими его отрезками из центра к точкам (ОХ1,ОУ1) и (ОХ2,ОУ2)
Процедура ВекторнаяКартинкаCHORD(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2,ОХ1,ОУ1,ОХ2,ОУ2) Экспорт
//Рисует сектор эллипса, дуга задается пересечением эллипса,
//заданного описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
//и пересекающими его отрезками из центра к точкам (ОХ1,ОУ1) и (ОХ2,ОУ2)
Процедура ВекторнаяКартинкаPIE(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2,ОХ1,ОУ1,ОХ2,ОУ2) Экспорт
//Рисует эллипс выбранным PEN с заливкой BRUSH,
//заданный описанным прямоугольником (ПрХ1,ПрУ1)-(ПрХ2,ПрУ2)
Процедура ВекторнаяКартинкаELLIPSE(картинка,ПрХ1,ПрУ1,ПрХ2,ПрУ2) Экспорт
//Закрашивает область выбранной BRUSH,
//Указываются координаты начала заливки, цвет и режим - 0 - до цвета границы, 1 - область указанного цвета
Процедура ВекторнаяКартинкаEXTFLOODFILL(картинка,Х,У,цвет,режим=0) Экспорт
//Перемещение текущей точки
Процедура ВекторнаяКартинкаMOVETO(картинка,х,у) Экспорт
//Рисование отрезка от текущей точки до указанных координат
Процедура ВекторнаяКартинкаLINETO(картинка,х,у) Экспорт
//Рисование ломаной, параметр "точки" - двумерный массив[][2] точек
Процедура ВекторнаяКартинкаPOLYLINE(картинка,точки) Экспорт
//Рисование многоугольника, параметр "точки" - двумерный массив[][2] точек
Процедура ВекторнаяКартинкаPOLYGON(картинка,точки) Экспорт
//Установить пиксель по заданным координатам
Процедура ВекторнаяКартинкаSETPIXEL(картинка,Х,У,цвет) Экспорт

Вывод текста:
//Вывод текста
Процедура ВекторнаяКартинкаTEXTOUT(картинка,х,у,текст) Экспорт
//Вывод текста с возможностью обрезки и указания межсимвольных отступов
Процедура ВекторнаяКартинкаEXTTEXTOUT(картинка,х,у,текст,опции=0,ПрХ1=0,ПрУ1=0,ПрХ2=0,ПрУ2=0,отступы=Неопределено) Экспорт
//Установить фоновый цвет
Процедура ВекторнаяКартинкаSETBKCOLOR(картинка,цвет) Экспорт
//Установить режим фона из ВыводФона
Процедура ВекторнаяКартинкаSETBKMODE(картинка,режим) Экспорт
//Установить режим выравнивания текста из ВыравниваниеТекста
Процедура ВекторнаяКартинкаSETTEXTALIGN(картинка,режим) Экспорт
//Установить цвет текста
Процедура ВекторнаяКартинкаSETTEXTCOLOR(картинка,цвет) Экспорт

//Отобразить растровую картинку с возможным сжатием/увеличением
//@ИсходнаяКартинка - системный объект Картинка формата BMP/JPG/PNG/GIF/TIFF/Icon
Процедура ВекторнаяКартинкаSTRETCHDIB(картинка,ИсходнаяКартинка,ИсхХ,ИсхУ,знач ИсхШирина=0,знач ИсхВысота=0,ЦельХ,ЦельУ,ЦельШирина,ЦельВысота) Экспорт

Картинка в заголовке сформирована следующей процедурой:

    к=СоздатьВекторнуюКартинку(15*400,15*200);
   
Белый=Новый Цвет(255,255,255);
   
Черный=Новый Цвет(0,0,0);
   
Красный=Новый Цвет(255,0,0);
   
Зеленый=Новый Цвет(0,255,0);
   
Голубой=Новый Цвет(128,128,255);
   
Синий=Новый Цвет(0,0,255);
   
Желтый=Новый Цвет(255,255,0);
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEFONTINDIRECT(к,Новый Шрифт("Arial",15*25,Ложь,Истина,Истина,Ложь),15*6,0));
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Невидимый,0,Белый));
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Голубой));
   
ВекторнаяКартинкаRECTANGLE(к,0,0,15*400-1,15*200-1);
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Зеленый));
   
ВекторнаяКартинкаRECTANGLE(к,0,15*100,15*400-1,15*200-1);
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Желтый));
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Сплошной,15*2,Желтый));
   
ВекторнаяКартинкаELLIPSE(к,15*300,15*30,15*370,15*70);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*335,15*10);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*335,15*90);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*310,15*15);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*360,15*15);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*310,15*85);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*360,15*85);
   
ВекторнаяКартинкаMOVETO(к,15*335,15*55);
   
ВекторнаяКартинкаLINETO(к,15*310,15*15);
   
ВекторнаяКартинкаARC(к,15*270,15*40,15*300,15*60,15*300,15*50,0,0);
   
ВекторнаяКартинкаARC(к,15*370,15*40,15*400,15*60,15*400,15*40,15*370,15*50);
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Штриховка,Красный,СтильШтриховки.КосойКрест));
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Сплошной,0,Синий));
   
ВекторнаяКартинкаSETBKCOLOR(к,Синий);
   
ВекторнаяКартинкаCHORD(к,15*10,15*10,15*40,15*40,15*35,15*50,15*35,15*0);
   
ВекторнаяКартинкаPIE(к,15*50,15*10,15*80,15*40,15*80,15*10,15*80,15*40);
   
точки1=Новый Массив(5,2);
   
Pi = 3.1415926535897932;
    Для
н=0 по 4 цикл
       
точки1[н][0]=Окр(Cos((360/5*н-90)/180*pi)*15*10)+15*100;
       
точки1[н][1]=Окр(Sin((360/5*н-90)/180*pi)*15*10)+15*20;
    КонецЦикла;
   
точки2=Новый Массив(6,2);
    Для
Н=0 по 5 цикл
       
точки2[н][0]=Окр(Cos((360/5*н*2-90)/180*pi)*15*10)+15*100;
       
точки2[н][1]=Окр(Sin((360/5*н*2-90)/180*pi)*15*10)+15*40;
    КонецЦикла;
   
ВекторнаяКартинкаPOLYGON(к,точки1);
   
ВекторнаяКартинкаPOLYLINE(к,точки2);
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEBRUSHINDIRECT(к,СтильКисть.Сплошной,Голубой));
   
ВекторнаяКартинкаSelectObject(к,ВекторнаяКартинкаCREATEPENINDIRECT(к,СтильКарандаш.Штрих,15*2,Новый Цвет(190,128,255)));
   
ВекторнаяКартинкаRECTANGLE(к,15*30,15*110,15*100,15*140);
   
ВекторнаяКартинкаROUNDRECT(к,15*330,15*150,15*380,15*180,15*10,15*10);
   
ВекторнаяКартинкаSETBKMODE(к,ВыводФона.Прозрачный);
   
ВекторнаяКартинкаSETTEXTALIGN(к,ВыравниваниеТекста.ПравоНиз);
   
ВекторнаяКартинкаSETTEXTCOLOR(к,Красный);
   
ВекторнаяКартинкаTEXTOUT(к,15*390,15*190,"Автор Pasha1st");
   
поток=ВекторнаяКартинкаСохранитьВДанные(к);
   
//поток.Записать("E:\2.wmf");
   
ЭтаФорма.ЭлементыФормы.ПолеКартинки1.Картинка=Новый Картинка(поток);
   
ЭлементыФормы.ПолеКартинки1.Масштабировать=Истина;

Предлагаю так же оценить аналогичный модуль рисования растровой картинки - BMP: //infostart.ru/public/310668/

WMF рисование картинки картинка векторная картинка векторное изображение

См. также

Разработка внешних компонент Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента в виде библиотеки (.dll файл), позволяющая посылать команды и получать ответы по протоколу WebSocket из 1С. Компонента работает только на стороне "клиента".

4440 руб.

22.06.2020    18124    18    33    

22

Разработка внешних компонент Телефония, SIP Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    46784    122    66    

66

Разработка внешних компонент Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

3000 руб.

12.05.2020    28218    138    100    

90

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62984    44    59    

82

Разработка внешних компонент Программист Платформа 1С v8.3 Платформа 1C v8.2 Платные (руб)

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    3394    2    0    

4

Разработка внешних компонент Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    36476    113    127    

114

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    18848    26    6    

41
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. WKBAPKA 215 13.11.14 10:25 Сейчас в теме
за труды :)
правда, зачем это нужно, не совсем понятно, но круто
3. Pasha1st 849 13.11.14 13:33 Сейчас в теме
(1) WKBAPKA, (2) bandru, Изврата тут много, факт. А вот для чего это было сделано:
В одной организации, которой я иногда помогаю, управление IT из центра, об оперативности каких-то внедрений мечтать не приходится. Организация печатает квитанции с включением штрихкода, а работа ведется в основном через терминальную ферму. В результате:
* установка шрифта штрихкода затруднена - прав нет, терминальных серверов много
* если вставлять штрихкод картинкой (а официальная ВК именно так и делает) - при передаче потока печати из терминальной сессии на локальный принтер картинка размазывается. При этом при локальном подключении печать четкая.
Формирование штрихкода как векторной картики решает проблему - штрихкод печатается четко вне зависимости от места запуска 1С.
Ну и векторное рисование происходит достаточно быстро, что дает возможности, не связанные с собственно учетом - встраивание игр в обработки.
Так что в ближайшее время выложу обработку формирования штрихкодов без ВК и шрифтов, и планирую нарисовать какую-нибудь игру типа арканоида-пакмана.
6. CratosX 114 27.11.14 19:57 Сейчас в теме
(3)
в ближайшее время выложу обработку формирования штрихкодов без ВК и шрифтов


о, я бы на это глянул!
7. Pasha1st 849 27.11.14 20:20 Сейчас в теме
(6) CratosX, практически закончил, до конца недели оформлю и выложу отдельной обработкой. Будет поддержка EAN8, EAN13, CODE39, CODABAR, CODE128
9. Pasha1st 849 03.01.15 00:15 Сейчас в теме
(6) CratosX, завершил, формирование штрихкодов без использования внешних компонент и шрифтов, смотреть тут
2. bandru 13.11.14 11:28 Сейчас в теме
Это примерно как бензопилой колбасу резать - в принципе можно, но как ведь нужно извратиться!
4. LuxVeritatis 18.11.14 16:28 Сейчас в теме
Что-то мне это напомнило, как мы в школе рисовали в Turbo Pascal, только на экране. А ещё можно добавить динамику. Ну там солнышко за горизонт ушло, трава пожелтела, снег пошёл. Кстати о снеге, как бы сделать снежинки на всех окнах?)
5. Pasha1st 849 19.11.14 15:16 Сейчас в теме
(4) Obscurus, напоминает, да, но есть и расширенные функции - сегмент эллипса (круга), дуга окружности, скругленные прямоугольники. Почему-то в WMF не предусмотрены сплайны - плавная линия, построенная по точкам, скорее всего в EMF они есть, не смотрел.
Картинка в заголовке у меня рисуется со скоростью 50шт/сек - полное формирование и преобразование к системному объекту Картинка. Анимацию сделать легко:
Делаем функцию Функция ПолучитьКартинку(парам) - с параметром "номер кадра", объявляем переменную перем нКадра; и функцию НарисоватьКадр() с кодом:
кар=ПолучитьКартинку(нКадра);
ЭтаФорма.ЭлементыФормы.ПолеКартинки1.Картинка=кар;
нКадра=нКадра+1;
Если нКадра<300 тогда
ПодключитьОбработчикОжидания("НарисоватьКадр",0.1,истина);
КонецЕсли;

Делаем вызов
ПодключитьОбработчикОжидания("НарисоватьКадр",0.1,истина);
И смотрим анимацию с 10FPS
8. NOVOPRO 11.12.14 08:13 Сейчас в теме
Похоже на детство, солнышко, травку через бейсик рисуешь.....
самое то для великовозростного дитя......
10. Pasha1st 849 03.01.15 00:20 Сейчас в теме
(8) NOVOPRO, Недостаток фантазии - беда для программиста ;)
Формирование рисунков можно использовать для различных нужд - штрихкоды, диаграммы, анимация, игры. Ценность встраиваемого решения без внешних зависимостей познается когда работаешь в ограниченной по правам среде.
11. AlexanderKai 22.04.15 09:42 Сейчас в теме
(8) NOVOPRO,
Вы видимо взрослый и работаете исключительно в командной строке.
Оставьте свое сообщение