Как программно изменить размер картинок в 1С: обзор эффективных способов

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

В процессе разработки конфигураций на платформе 1С:Предприятие часто возникает задача оптимизации хранения графических данных. Хранение полноразмерных фотографий (например, весом по 5-10 Мб каждая) в информационной базе быстро приводит к ее чрезмерному раздуванию, замедлению резервного копирования и снижению производительности при формировании отчетов или выводе списков товаров. Решением является программный ресайз — автоматическое изменение разрешения картинки до разумных пределов непосредственно при загрузке или обработке.

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

Способ 1. Использование встроенного объекта платформы «ОбработкаКартинок»

Начиная с версии платформы 8.3.10, разработчикам стал доступен штатный механизм, который является наиболее предпочтительным. Рассмотрим его преимущества: он полностью кроссплатформенный (работает и на Windows, и на Linux), не требует регистрации внешних библиотек и поддерживает современные форматы, такие как WebP (в новых версиях).

Давайте проанализируем пример кода, который позволяет изменить размер изображения, сохраняя его пропорции:


// Функция выполняет ресайз картинки штатными средствами платформы
Функция ИзменитьРазмерКартинкиШтатно(ДанныеКартинки, НужнаяШирина, НужнаяВысота)
    
    // Создаем объект на основании двоичных данных или существующей картинки
    КартинкаОригинал = Новый Картинка(ДанныеКартинки);
    Обработка = Новый ОбработкаКартинок;
    
    // Загружаем картинку в обработчик
    Обработка.УстановитьКартинку(КартинкаОригинал);
    
    // Применяем фильтр изменения размера. 
    // Если один из параметров 0, пропорции сохраняются автоматически.
    Обработка.УстановитьРазмер(НужнаяШирина, НужнаяВысота);
    
    // Получаем результат обработки
    Результат = Обработка.ПолучитьКартинку();
    
    Возврат Результат.ПолучитьДвоичныеДанные();
    
КонецФункции

Разберем по шагам, что происходит в данном коде. Сначала мы инициализируем объект ОбработкаКартинок. Этот объект является «контейнером» для операций. Метод УстановитьРазмер() позволяет гибко управлять итоговым разрешением. Если мы хотим жестко задать рамки, мы указываем оба параметра. Если же нам важно сохранить исходное соотношение сторон, достаточно указать только ширину, передав во второй параметр значение 0.

Способ 2. Использование системного объекта Windows Image Acquisition (WIA)

Если по каким-то причинам вы используете старые версии платформы или вам требуется специфическая обработка в среде Windows без установки дополнительного ПО, отличным вариантом станет использование COM-объекта WIA. Этот компонент входит в состав операционной системы, начиная с Windows XP, и позволяет работать с изображениями «из коробки».

Рассмотрим реализацию функции ресайза через WIA, предложенную сообществом:


Функция ПолучитьХранилищеЗначенийМиниатюры(ИмяФайла, МаксимальнаяШирина = 92, МаксимальнаяВысота = 92)
    
    Ф = Новый Файл(ИмяФайла);
    // Подготавливаем имя для временного файла результата
    ИмяРезультата = ПолучитьИмяВременногоФайла(Ф.Расширение);
    
    // Инициализируем системные COM-объекты
    objImageFile = Новый COMОбъект("WIA.ImageFile");
    objImageProcess = Новый COMОбъект("WIA.ImageProcess");
    
    // Загружаем исходный файл
    objImageFile.LoadFile(ИмяФайла);
    
    // Добавляем фильтр масштабирования (Scale)
    objImageProcess.Filters.Add(objImageProcess.FilterInfos("Scale").FilterID);
    
    // Настраиваем параметры фильтра
    // Индекс 1 соответствует добавленному выше фильтру Scale
    objImageProcess.Filters.Item(1).Properties.Item("MaximumWidth").Value = МаксимальнаяШирина;
    objImageProcess.Filters.Item(1).Properties.Item("MaximumHeight").Value = МаксимальнаяВысота;
    
    // Применяем процесс к файлу и сохраняем результат
    objImageFile = objImageProcess.Apply(objImageFile);
    objImageFile.SaveFile(ИмяРезультата);
    
    // Возвращаем результат в виде ХранилищаЗначения для записи в БД
    Возврат Новый ХранилищеЗначения(Новый Картинка(ИмяРезультата));
    
КонецФункции

Проанализируем ситуацию: объект WIA.ImageFile служит для чтения и хранения данных изображения, а WIA.ImageProcess выступает в роли процессора эффектов. Мы добавляем фильтр с идентификатором Scale, который отвечает за масштабирование. Важный нюанс: свойства MaximumWidth и MaximumHeight гарантируют, что картинка не выйдет за указанные пределы, при этом системная библиотека самостоятельно рассчитает пропорции, чтобы изображение не выглядело растянутым.

Способ 3. Работа с библиотекой JpegLib через COM

Существуют также специализированные библиотеки, такие как JpegLib. Они ориентированы на высокую скорость работы с форматом JPEG. Несмотря на то, что они требуют регистрации в системе (через regsvr32), они могут быть полезны в специфических задачах автоматизации.

Посмотрим на пример использования такой компоненты:


Процедура ВыполнитьРесайзЧерезJpegLib(ПутьОригинала, ПутьРезультата, Ширина, Высота)
    
    Попытка
        мРесайзер = Новый COMОбъект("JpegLib.cJpeg");
    Исключение
        Сообщить("Библиотека JpegLib не зарегистрирована в системе!");
        Возврат;
    КонецПопытки;
    
    // Загружаем картинку
    мРесайзер.Load(ПутьОригинала);
    
    // Устанавливаем качество сжатия (от 1 до 100)
    Качество = 85;
    
    // Сохраняем с новыми размерами
    мРесайзер.SaveModified(Ширина, Высота, ПутьРезультата, Качество);
    
КонецПроцедуры

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

Сравнение подходов и выбор оптимального решения

Выясним, какой из методов лучше подходит для ваших задач, проанализировав их ключевые особенности:

  1. Штатная ОбработкаКартинок:
    • Плюсы: Кроссплатформенность, поддержка платформой 1С, высокая стабильность, работа с WebP, PNG, JPG, GIF.
    • Минусы: Требует версию платформы не ниже 8.3.10.
  2. WIA (Windows Image Acquisition):
    • Плюсы: Не требует установки стороннего ПО в Windows, встроена в ОС.
    • Минусы: Работает только под Windows, медленнее штатных средств 1С, может «затирать» метаданные EXIF.
  3. Внешние утилиты (ImageMagick):
    • Плюсы: Огромный функционал, профессиональное качество обработки.
    • Минусы: Требует запуска исполняемых файлов (.exe), что часто запрещено политиками безопасности (Security Policy), требует установки на сервер или клиентское место.

Рекомендация: В современных реалиях разработки на 1С 8.3 всегда старайтесь использовать ОбработкаКартинок. Это избавит вас от проблем с правами доступа к системным папкам и обеспечит корректную работу кода на серверах под управлением Linux. Если же вы ограничены старой версией платформы (например, 8.2 или ранние 8.3), используйте метод с WIA, так как он наиболее автономен и безопасен с точки зрения системного администрирования.

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

← На главную