Как получить реальный размер картинки в пикселях средствами 1С?

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

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

Использование встроенных свойств объекта «Картинка»

В современных версиях платформы 1С задача решается максимально просто. Если ваша конфигурация не ограничена жестким режимом совместимости с устаревшими версиями, разработчики платформы уже позаботились о вас. У объекта Картинка появились встроенные свойства Высота и Ширина.

Это самый предпочтительный способ, так как он не требует обращения к внешним библиотекам или анализа бинарной структуры файлов. Мы просто считываем свойства напрямую:


// Пример получения размеров для современной платформы
КартинкаОбъект = Новый Картинка("ПутьКФайлу.png");
Ширина = КартинкаОбъект.Ширина;
Высота = КартинкаОбъект.Высота;
Сообщить("Размеры: " + Ширина + " x " + Высота);

Использование COM-объекта Shell.Application

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

Разберем, как это реализовать на практике:


Процедура ОпределитьРазмерКартинки(ПутьКФайлу)
    // Разделяем путь на каталог и имя файла
    ФайлКартинки = Новый Файл(ПутьКФайлу);
    Каталог = ФайлКартинки.Путь;
    Имя = ФайлКартинки.Имя;
    
    objShellApp = Новый COMОбъект("Shell.Application");
    objFolder = objShellApp.NameSpace(СокрЛП(Каталог));
    objItem = objFolder.ParseName(СокрЛП(Имя));
    
    // Индекс 31 соответствует свойству размеров в проводнике Windows
    Размеры = objFolder.GetDetailsOf(objItem, 31);
    Размеры = СтрЗаменить(Размеры, "?", "");
    Сообщить("Размеры картинки: " + Размеры);
КонецПроцедуры

Обратите внимание: данный способ зависит от локальных настроек Windows и может работать медленнее, чем встроенные методы. Кроме того, этот подход не применим при работе сервера 1С под управлением ОС Linux.

Анализ двоичных данных для старых версий платформы

Для версий 8.1 и 8.2, где встроенные методы получения размеров отсутствуют, применялся метод прямого анализа заголовка файла. Чтобы не писать парсеры для каждого типа расширений (JPG, BMP, TIF), мы приводим изображение к единому стандарту — PNG. У этого формата структура заголовка стабильна.

Разберем алгоритм решения этой задачи по шагам:

  1. Преобразуем исходную картинку в формат PNG методом Преобразовать.
  2. Получаем ДвоичныеДанные картинки и преобразуем их в строку.
  3. Выделяем байты, отвечающие за ширину и высоту, и конвертируем их из шестнадцатеричного представления в десятичное.

Функция Hex2Dec(Стр1, Base = 16)
    Рез = 0;
    Стр = СтрЗаменить(Стр1, " ", "");
    КК = СтрДлина(Стр);
    Для К = 1 по КК Цикл
        Рез = Рез * Base + Найти("0123456789ABCDEF", Сред(Стр, К, 1)) - 1;
    КонецЦикла;
    Возврат Рез;
КонецФункции

Процедура ПоказатьРазмер(Картинка)
    КартинкаPNG = Картинка.Преобразовать(ФорматКартинки.PNG);
    ДанныеСтрокой = "" + КартинкаPNG.ПолучитьДвоичныеДанные();
    
    // Позиции байт в структуре PNG
    Ширина = Hex2Dec(Сред(ДанныеСтрокой, 49, 11));
    Высота = Hex2Dec(Сред(ДанныеСтрокой, 61, 11));
    
    Сообщить("Размер: " + Формат(Ширина, "ЧГ=0") + "x" + Формат(Высота, "ЧГ=0"));
КонецПроцедуры

Подводя итоги

Мы проанализировали три способа решения поставленной задачи. При выборе метода всегда придерживайтесь правила: чем проще код, тем лучше. Сначала проверяйте наличие методов Ширина и Высота у объекта Картинка. Если же вы работаете в специфической среде или на очень старых версиях системы, используйте COM-объект для Windows-клиентов или анализ двоичных данных как универсальный, но более сложный способ. Надеемся, данное руководство поможет вам эффективно реализовать проверку изображений в ваших проектах.

← На главную