В процессе разработки конфигураций на платформе 1С:Предприятие часто возникает задача оптимизации хранения графических данных. Хранение полноразмерных фотографий (например, весом по 5-10 Мб каждая) в информационной базе быстро приводит к ее чрезмерному раздуванию, замедлению резервного копирования и снижению производительности при формировании отчетов или выводе списков товаров. Решением является программный ресайз — автоматическое изменение разрешения картинки до разумных пределов непосредственно при загрузке или обработке.
В этой статье мы подробно разберем несколько подходов к решению этой задачи: от современных штатных средств платформы до использования системных библиотек Windows, которые не требуют покупки платных компонент или сложной настройки серверов.
Начиная с версии платформы 8.3.10, разработчикам стал доступен штатный механизм, который является наиболее предпочтительным. Рассмотрим его преимущества: он полностью кроссплатформенный (работает и на Windows, и на Linux), не требует регистрации внешних библиотек и поддерживает современные форматы, такие как WebP (в новых версиях).
Давайте проанализируем пример кода, который позволяет изменить размер изображения, сохраняя его пропорции:
// Функция выполняет ресайз картинки штатными средствами платформы
Функция ИзменитьРазмерКартинкиШтатно(ДанныеКартинки, НужнаяШирина, НужнаяВысота)
// Создаем объект на основании двоичных данных или существующей картинки
КартинкаОригинал = Новый Картинка(ДанныеКартинки);
Обработка = Новый ОбработкаКартинок;
// Загружаем картинку в обработчик
Обработка.УстановитьКартинку(КартинкаОригинал);
// Применяем фильтр изменения размера.
// Если один из параметров 0, пропорции сохраняются автоматически.
Обработка.УстановитьРазмер(НужнаяШирина, НужнаяВысота);
// Получаем результат обработки
Результат = Обработка.ПолучитьКартинку();
Возврат Результат.ПолучитьДвоичныеДанные();
КонецФункции
Разберем по шагам, что происходит в данном коде. Сначала мы инициализируем объект ОбработкаКартинок. Этот объект является «контейнером» для операций. Метод УстановитьРазмер() позволяет гибко управлять итоговым разрешением. Если мы хотим жестко задать рамки, мы указываем оба параметра. Если же нам важно сохранить исходное соотношение сторон, достаточно указать только ширину, передав во второй параметр значение 0.
Если по каким-то причинам вы используете старые версии платформы или вам требуется специфическая обработка в среде 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 гарантируют, что картинка не выйдет за указанные пределы, при этом системная библиотека самостоятельно рассчитает пропорции, чтобы изображение не выглядело растянутым.
Существуют также специализированные библиотеки, такие как JpegLib. Они ориентированы на высокую скорость работы с форматом JPEG. Несмотря на то, что они требуют регистрации в системе (через regsvr32), они могут быть полезны в специфических задачах автоматизации.
Посмотрим на пример использования такой компоненты:
Процедура ВыполнитьРесайзЧерезJpegLib(ПутьОригинала, ПутьРезультата, Ширина, Высота)
Попытка
мРесайзер = Новый COMОбъект("JpegLib.cJpeg");
Исключение
Сообщить("Библиотека JpegLib не зарегистрирована в системе!");
Возврат;
КонецПопытки;
// Загружаем картинку
мРесайзер.Load(ПутьОригинала);
// Устанавливаем качество сжатия (от 1 до 100)
Качество = 85;
// Сохраняем с новыми размерами
мРесайзер.SaveModified(Ширина, Высота, ПутьРезультата, Качество);
КонецПроцедуры
В данном случае мы видим максимально упрощенный интерфейс. Метод SaveModified выполняет сразу две задачи: изменение геометрических размеров и пересчет коэффициента сжатия (качества), что позволяет дополнительно уменьшить размер файла в байтах.
Выясним, какой из методов лучше подходит для ваших задач, проанализировав их ключевые особенности:
WebP, PNG, JPG, GIF..exe), что часто запрещено политиками безопасности (Security Policy), требует установки на сервер или клиентское место.Рекомендация: В современных реалиях разработки на 1С 8.3 всегда старайтесь использовать ОбработкаКартинок. Это избавит вас от проблем с правами доступа к системным папкам и обеспечит корректную работу кода на серверах под управлением Linux. Если же вы ограничены старой версией платформы (например, 8.2 или ранние 8.3), используйте метод с WIA, так как он наиболее автономен и безопасен с точки зрения системного администрирования.
Подводя итог, можно сказать, что задача ресайза картинок в 1С сегодня решается достаточно просто. Мы рассмотрели основные инструменты, которые позволяют программно управлять медиа-контентом, сохраняя производительность системы и чистоту кода.