Доброго времени суток. Ищу способ получить реальный размер картинки в пикселях средствами 1С. Нашел вот такое видео https://www.youtube.com/watch?v=I1si3x6uohg
Но не могу найти исходники от этого видео, а на видео ничего не видно. Может у кого то есть эти исходники или кто то все таки смог средствами 1С решить данную задачу без жутких костылей
---
собственно
вот.
скрин как выглядит файл картинки в 16тиричном виде.
И код - выдранный с вашего видео.

Все просто и понятно.
Интересно зачем ? Ведь количество пикселей само по себе может быть разным на дюйм. Если оценивать высоту в каком то макете, то нужно картинки стандартизировать, делать эталон - например 100 пикселей, и на форме смотреть сколько пикселей в миллиметр умещается.
---
Нет в исходниках других примеров, я их нашел - в описании к плейлисту ссылки на облако.

А чтобы не изучать другие форматы автор видео использует прекрасный метод картинки Преобразовать() - он любую картинку преобразует в PNG, а свойства этого формата всегда одинаковые.

Кстати, в новых версиях платформы у картинки появились новые методы - Высота() и Глубина(). Так что теперь можно вообще с заголовком не заморачиваться (если режим совместимости конфигурации позволяет)
---
там на видео ищется в двоичных данных определенная последовательность байт, и вытаскивается.
Все же понятно по видео. И исходников никаких не надо, там же ключевой код видно
Пропускается первые 16 байт,
и начиная с 17 байта - 8 байт - это размер картинки.

Не факт что в форматах с другим расширением точно такое же устройство.
---
Так в том то и дело, я подозреваю, что в исходниках есть примеры для большинства форматов, а самому изучать эти форматы как то довольно не быстро, всегда проще использовать и разбираться с готовым исходником. Так то и ракету самому можно построить...
---
Нет в исходниках других примеров, я их нашел - в описании к плейлисту ссылки на облако.

А чтобы не изучать другие форматы автор видео использует прекрасный метод картинки Преобразовать() - он любую картинку преобразует в PNG, а свойства этого формата всегда одинаковые.

Кстати, в новых версиях платформы у картинки появились новые методы - Высота() и Глубина(). Так что теперь можно вообще с заголовком не заморачиваться (если режим совместимости конфигурации позволяет)
---
Оооооо, спасибо! Теперь много стало понятно и про новые методы не знал, теперь буду рыть дальше...
---
Кстати на момент написания вопроса в комментах к видео не было кода, вот я и подумал, что там еще выше что то есть, а оказалось что весь код таки уместился на видео. Еще раз спасибо что ткнули носом!
---
собственно
вот.
скрин как выглядит файл картинки в 16тиричном виде.
И код - выдранный с вашего видео.

Все просто и понятно.
Интересно зачем ? Ведь количество пикселей само по себе может быть разным на дюйм. Если оценивать высоту в каком то макете, то нужно картинки стандартизировать, делать эталон - например 100 пикселей, и на форме смотреть сколько пикселей в миллиметр умещается.
---
Да спасибо, думал, что на видео есть еще какой-то важный код выше того который виден, сразу не допер. А размер в пикселях нужен к примеру если есть ограничение на размер картинки при загрузке в базу, нужно к примеру проверить, что бы логотип был не больше какого то определенного размера.
---
```1c
    Процедура ОпределитьРазмерКартинки(Кнопка)

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл с картинкой";
    Диалог.ПолноеИмяФайла = ";
    Диалог.ПредварительныйПросмотр = Истина;
    Диалог.Фильтр =
    "Все картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf|" ; // картинки

    Если Диалог.Выбрать() Тогда
    Каталог=Диалог.Каталог;
    Имя=Сред(Диалог.ПолноеИмяФайла,стрДлина(Каталог)+1);

    objShellApp=Новый COMОбъект("Shell.Application");
    objFolder=objShellApp.NameSpace(СокрЛП(Каталог));
    objItem=objFolder.ParseName(СокрЛП(Имя));
    размеры=objFolder.GetDetailsOf(objItem,31);
    //Для иии=0 по 200 Цикл
    // Сообщить("+иии+" - "+objFolder.GetDetailsOf(objItem,иии));
    //КонецЦикла;
    Размеры=СтрЗаменить(размеры,"?",");
    Сообщить("Размеры картинки - "+Размеры);
    КонецЕсли;
    КонецПроцедуры
```
---
Спасибо! Интересный вариант.
---
Да, но не средствами 1С.
---
Там еще, если разремарить, можно и другие свойства увидеть.
---
К сожалению, предложенные варианты не годятся для версии 8.2 (по крайней мере, в режиме совместимости с 8.1)
Поэтому для этих версий можно использовать такой вариант:

```1c
    Перем Цифры,СЦифры;

    Функция Hex2Dec(Стр1,Base=16) // функция для преобразования из шестнадцатеричного формата
    Рез=0;
    Стр=СтрЗаменить(Стр1," ","); // сначала нужно убрать разделительные пробелы
    КК=СтрДлина(Стр);
    Для К=1 по КК Цикл
    Рез=Рез*Base+СЦифры[Сред(Стр,К,1)];
    КонецЦикла;
    Возврат Рез;
    КонецФункции

    Процедура ПоказатьРазмер(Картинка) // Картинка, для которой нужно получить размер
    Если ЗначениеЗаполнено(Картинка) Тогда
    Картинка2=Картинка.Преобразовать(ФорматКартинки.PNG);
    ДанныеКартинки="+Картинка2.ПолучитьДвоичныеДанные(); // преобразуем двоичные данные картинки в текстовую строку
    Ширина=Hex2Dec(Сред(ДанныеКартинки,49,11)); // в такой строке ширина будет начинаться с 49 символа,
    Высота=Hex2Dec(Сред(ДанныеКартинки,61,11)); // а высота – с 61
    Сообщить("Размер картинки: "+Формат(Ширина,"ЧГ=0")+"х"+Формат(Высота,"ЧГ=0"));
    Иначе
    Сообщить("Пустая картинка!");
    КонецЕсли;
    КонецПроцедуры

    // Необходимы для преобразования из шестнадцатеричного формата
    Цифры="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    СЦифры=Новый Соответствие;
    Для К=1 по СтрДлина(Цифры) Цикл СЦифры[Сред(Цифры,К,1)]=К-1 КонецЦикла;
```
---
Спасибо! Положим в копилку :)