Как уменьшить размер фотографии средствами 1С без потери качества?

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

В процессе интеграции 1С с интернет-магазинами или мобильными приложениями часто возникает задача оптимизации графического контента. Профессиональные фотографии товаров, загружаемые в базу, могут весить десятки мегабайт, что недопустимо для быстрой загрузки страниц сайта. В этой статье мы подробно разберем, как уменьшить разрешение и вес картинки непосредственно в коде 1С, рассмотрим современные встроенные средства платформы и альтернативные методы для более ранних версий. Для автоматического сбора файлов из внешних источников подойдёт обработка для загрузки изображений товаров с сайтов.

Метод 1: Использование встроенного объекта ОбрабатываемаяКартинка (для версий 8.3.14 и выше)

Начиная с версии платформы 8.3.14, разработчикам стал доступен мощный инструмент — объект ОбрабатываемаяКартинка. Это наиболее «чистый» и производительный способ решения задачи, так как он не требует регистрации внешних библиотек или установки стороннего ПО на сервер.

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


// Получаем двоичные данные исходного файла
КартинкаИсточник = Новый Картинка("C:\Temp\OriginalPhoto.jpg");

// Создаем объект для обработки
ОбрабатываемаяКартинка = Новый ОбрабатываемаяКартинка(КартинкаИсточник);

// Определяем новые размеры. Например, ограничим ширину 800 пикселями
НоваяШирина = 800;
Коэффициент = НоваяШирина / ОбрабатываемаяКартинка.Ширина();
НоваяВысота = ОбрабатываемаяКартинка.Высота() * Коэффициент;

// Выполняем масштабирование
ОбрабатываемаяКартинка.УстановитьРазмер(НоваяШирина, НоваяВысота);

// Сохраняем результат с оптимизацией
// Можно выбрать формат и степень сжатия (для JPEG)
ДанныеРезультата = ОбрабатываемаяКартинка.ПолучитьКартинку();
ДанныеРезультата.Записать("C:\Temp\ResizedPhoto.jpg");

Важный нюанс: при использовании метода УстановитьМаксимальныйРазмер платформа сама рассчитает пропорции, если задать только одно измерение. Это избавляет нас от лишних математических вычислений в коде.

Метод 2: Использование библиотеки WIA (Windows Image Acquisition)

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

Выясним, как работает библиотека WIA. Она предоставляет фильтры для обработки изображений, один из которых называется Scale. Разберем по шагам реализацию этого метода:


// Создаем основные COM-объекты
ImageFile = Новый COMОбъект("WIA.ImageFile");
ImageProcess = Новый COMОбъект("WIA.ImageProcess");

// Загружаем исходный файл
ImageFile.LoadFile("C:\Photos\Input.jpg");

// Настраиваем фильтр масштабирования
ImageProcess.Filters.Add(ImageProcess.FilterInfos("Scale").FilterID);

// Задаем параметры фильтра (индекс 1, так как мы добавили только один фильтр)
ImageProcess.Filters.Item(1).Properties.Item("MaximumWidth").Value = 600;
ImageProcess.Filters.Item(1).Properties.Item("MaximumHeight").Value = 600;
// Сохранять пропорции (True по умолчанию в большинстве реализаций WIA)
ImageProcess.Filters.Item(1).Properties.Item("PreserveAspectRatio").Value = Истина;

// Применяем фильтр и получаем новый объект изображения
ResultImage = ImageProcess.Apply(ImageFile);

// Сохраняем результат на диск
ResultImage.SaveFile("C:\Photos\Output.jpg");

Важное предупреждение: библиотека WIA может выдавать ошибки (например, ARGBData), если изображение имеет специфический формат (CMYK, наличие альфа-канала прозрачности) или если файл поврежден. Также помните, что при работе на стороне сервера 1С (64-бит) необходимо убедиться, что соответствующая библиотека зарегистрирована в системе.

Метод 3: Использование внешних утилит (ImageMagick, IrfanView)

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

Рассмотрим использование ImageMagick через объект WScript.Shell. Это мощнейший инструмент, который «переваривает» практически любые форматы изображений.


КомандаЗапуска = "convert.exe ""C:\In.jpg"" -resize 800x600 -quality 75 ""C:\Out.jpg""";
WshShell = Новый COMОбъект("WScript.Shell");
// Запускаем и ждем завершения (параметр -1)
Результат = WshShell.Run(КомандаЗапуска, 0, Истина);

Если Результат <> 0 Тогда
    Сообщить("Ошибка при обработке изображения!");
КонецЕсли;

При использовании внешних утилит важно учитывать следующие моменты:

  1. Пути к файлам: всегда используйте кавычки для путей, так как в них могут быть пробелы.
  2. Права доступа: у пользователя, под которым запущен сервер 1С, должны быть права на запуск внешних приложений и запись в целевые папки.
  3. Ожидание завершения: обязательно используйте флаг ожидания в методе Run, иначе 1С попытается отправить файл на FTP до того, как внешняя программа закончит его сжимать.

Технические тонкости оптимизации для интернет-магазинов

Просто уменьшить пиксели — это лишь половина дела. Чтобы картинка была действительно «легкой» и качественной, проанализируем дополнительные параметры:

1. Удаление метаданных (EXIF): Профессиональные камеры записывают в файл много технической информации (модель камеры, GPS, настройки света). В некоторых случаях эти данные могут занимать до 10-15% веса файла. Объект ОбрабатываемаяКартинка при сохранении позволяет минимизировать лишний мусор.

2. Разрешение (DPI): Для мониторов достаточно 72 DPI. Если исходное фото подготовлено для печати (300 DPI), его физический вес будет выше. При ресайзе в 1С платформа автоматически приводит картинку к стандартному экранному разрешению.

3. Формат WebP: Если ваш сайт поддерживает этот формат, рассмотрите возможность конвертации. К сожалению, встроенный объект 1С (до последних версий) не всегда корректно работает с WebP на запись, поэтому здесь лучше использовать вызов magick.exe или специализированные библиотеки на стороне PHP сервера (библиотека GD), как предлагалось в обсуждении.

4. Обработка ошибок: Всегда проверяйте существование файла после обработки. Если библиотека WIA или внешняя утилита столкнется с файлом в формате CMYK, она может создать пустой файл или выдать ошибку. Мы рекомендуем использовать конструкцию Попытка...Исключение вокруг кода обработки графики.

Сводная таблица выбора метода

Посмотрим на сравнение методов, чтобы выбрать оптимальный для вашего проекта:

  1. ОбрабатываемаяКартинка: Лучший выбор для новых конфигураций. Высокая скорость, нет зависимости от ОС.
  2. WIA: Подходит для старых систем (Windows). Требует минимум настройки, но капризен к форматам.
  3. ImageMagick / IrfanView: Самый функциональный вариант. Позволяет делать массовую обработку, накладывать эффекты и работать с редкими форматами.
  4. PHP на стороне сайта: Переносит нагрузку с сервера 1С на веб-сервер. Идеально, если 1С перегружена другими задачами.

Разберем типичный сценарий: менеджер загружает фото весом 10 Мб в карточку товара. Наша задача — при записи элемента создать два кэша (превью 100x100 и основное фото 800x800). Мы рекомендуем выполнять эту операцию в фоновом задании, чтобы пользователь не ждал окончания процесса сжатия, а мог продолжать работу с документом. Это значительно повысит комфортность работы в системе.

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

← На главную