Как объединить несколько изображений в один коллаж в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Ограничения встроенных механизмов платформы 1С

В типовой платформе 1С:Предприятие объект ОбрабатываемаяКартинка предназначен для работы только с одним файлом за раз: масштабирования, поворота, кадрирования или преобразования формата. Прямого встроенного метода для склейки двух и более растровых файлов в одну результирующую картинку в платформе нет. Для решения задачи объединения изображений программисту необходимо задействовать внешние консольные утилиты, системные COM-объекты или механизмы векторной графики.

Решение 1: Использование утилиты ImageMagick

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

Рассмотрим типовую команду сборки коллажа из командной строки:


montage -geometry 200x200+5+5 -tile 3x file1.jpg file2.jpg file3.jpg file4.jpg result.jpg

Разберем по шагам, как вызвать данную операцию программно из 1С с помощью метода ЗапуститьПриложение:


ПараметрыЗапуска = "montage -geometry 150x150+2+2 C:\Temp\img1.jpg C:\Temp\img2.jpg C:\Temp\result.jpg";
КодВозврата = 0;
ЗапуститьПриложение(ПараметрыЗапуска, , Истина, КодВозврата);

Если КодВозврата <> 0 Тогда
    ВызватьИсключение "Ошибка при выполнении сборки коллажа утилитой montage.";
КонецЕсли;

Анализ частых ошибок при работе с ImageMagick:

  1. Ошибка «montage не является внутренней или внешней командой»: возникает, если утилита не найдена в системной переменной PATH. Операционная система считывает список путей при старте процесса. Если ImageMagick был установлен только что, перезапустите сеанс 1С или серверную службу. Наиболее надежный способ избежать ошибки — всегда указывать полный абсолютный путь к исполняемому файлу в кавычках (например, "\"C:\Program Files\ImageMagick\montage.exe\" ...").
  2. Синтаксис современных версий: в последних версиях ImageMagick вызовы консоли объединены под единой точкой входа magick, поэтому команда принимает вид: magick montage ... или magick convert ....
  3. Работа через COM-объект: ImageMagick предоставляет COM-интерфейс ImageMagickObject.MagickImage, который позволяет избежать вызова внешних процессов и формировать коллажи непосредственно внутри сеанса 1С.

Решение 2: Использование системной библиотеки Windows Image Acquisition (WIA)

Если на клиентских рабочих станциях под управлением Windows нежелательно устанавливать дополнительное стороннее ПО, проанализируем возможности системной библиотеки WIA. Объект WIA.ImageProcess предоставляет фильтр Stamp, позволяющий накладывать одно изображение на другое по заданным координатам.

Посмотрим на пример наложения картинок через COM-объект WIA:


БазовоеИзображение = Новый COMОбъект("WIA.ImageFile");
БазовоеИзображение.LoadFile("C:\Temp\base.png");

НакладываемоеИзображение = Новый COMОбъект("WIA.ImageFile");
НакладываемоеИзображение.LoadFile("C:\Temp\layer.png");

Процессор = Новый COMОбъект("WIA.ImageProcess");
ФильтрStamp = Процессор.FilterInfos("Stamp").FilterID;

Процессор.Filters.Add(ФильтрStamp);
Процессор.Filters(1).Properties("ImageFile").Value = НакладываемоеИзображение;
Процессор.Filters(1).Properties("Left").Value = 50;
Процессор.Filters(1).Properties("Top").Value = 50;

ИтоговоеИзображение = Процессор.Apply(БазовоеИзображение);
ИтоговоеИзображение.SaveFile("C:\Temp\combined.png");

Решение 3: Сборка через векторный формат SVG без внешних библиотек

Платформа 1С нативно поддерживает векторный формат SVG. Если требуется объединить несколько изображений без привлечения COM-объектов и внешних исполняемых файлов (что особенно актуально для серверов на Linux), мы можем программно сгенерировать SVG-контейнер, в котором исходные картинки встраиваются в виде Base64-данных внутри тегов <image>.

Разберем по шагам формирование SVG-коллажа:


Картинка1Двоичные = Новый ДвоичныеДанные("C:\Temp\img1.png");
Base64_1 = Base64Строка(Картинка1Двоичные);

Картинка2Двоичные = Новый ДвоичныеДанные("C:\Temp\img2.png");
Base64_2 = Base64Строка(Картинка2Двоичные);

SVGТекст = 
"<svg width=""400"" height=""200"" xmlns=""http://www.w3.org/2000/svg"">" +
"  <image x=""0"" y=""0"" width=""200"" height=""200"" href=""data:image/png;base64," + Base64_1 + """ />" +
"  <image x=""200"" y=""0"" width=""200"" height=""200"" href=""data:image/png;base64," + Base64_2 + """ />" +
"</svg>";

ЗаписьТекста = Новый ЗаписьТекста("C:\Temp\collage.svg", КодировкаТекста.UTF8);
ЗаписьТекста.Записать(SVGТекст);
ЗаписьТекста.Закрыть();

ИтоговаяКартинка = Новый Картинка("C:\Temp\collage.svg");

Решение 4: Отрисовка через HTML Canvas

При работе в управляемых формах можно использовать встроенный элемент ПолеHTMLДокумента. С помощью JavaScript и контекста Canvas 2D (метод drawImage) выполняется загрузка набора изображений, отрисовка их на виртуальном холсте с любыми трансформациями и экспорт готового результата методом toDataURL() обратно в 1С через строковый параметр Base64.

Резюме

  1. Для пакетной и сложной обработки картинок (сетки, авторазмещение, масштабирование) оптимальным выбором остается утилита ImageMagick. При вызове через ЗапуститьПриложение всегда передавайте абсолютные пути к исполняемым файлам.
  2. Для простого послойного наложения на клиентах Windows без установки стороннего софта подходит встроенный COM-объект WIA.ImageProcess.
  3. Для кроссплатформенных решений (Windows/Linux) без внешних зависимостей наиболее удобна сборка итогового макета в формате SVG.
← На главную