Быстрый (но тернистый) путь к метаданным картинок в 1С

06.08.21

Разработка - Инструментарий разработчика

Задача звучала так: прочитать GPS-геометки из картинок. Всё закончилось бы как у всех, кто брался за эту задачу, – сторонним сервисом или утилитой. Но в обсуждении кто-то сказал, «да 1С так не сможет» …

Скачать файлы

Наименование Файл Версия Размер
Демонстрация чтения EXIF из JPEG
.epf 25,19Kb
9
.epf 25,19Kb 9 Скачать

Зачем мне вообще эти метаданные?

Скажу сразу, это – скорее техническая статья про двоичные данные. Однако, чтобы люди с прикладным мышлением не обошли её стороной, опишу чем технология полезна, и какую ценность (надеюсь) добавляет моя работа. Если технические тонкости вам не интересны – после прочтения этого раздела смело переходите к последнему.

Итак, метаданные картинок нужны:

  • Продуктовому аналитику, как источник ценной продуктовой информации: модель и марка телефона, геолокация и даты снимка и многое другое – полезные данные для сегментации рынка и других маркетинговых изысканий.
  • Менеджеру, как источник фактической информации. Нередко работники, например курьеры, подтверждают выполнение задач фотографиями. Анализ геометок и даты снимка позволяют автоматизировать контроль.
  • Специалисту по антифроду – помимо упомянутых геометок и дат, метаданные оставляют много других следов: была ли фотография отредактирована и когда, в какой программе было произведено редактирование, есть ли логическое несоответствие во внутренних timestamp’ах и прочее.
  • Разработчику веб-сервисов на 1С – полезным будет оперирование файлом без сохранения на диск. Оперируя потоком можно отсекать логикой сервиса (например) картинки слишком маленького размера, черно-белые снимки, пустые архивы, аудиофайлы длины меньшей чем положено и т.д. Вас ограничивает только фантазия и соответствующий стандарт метаданных.
  • Разработчику интерфейсов – метаданные это, пожалуй, единственный быстрый способ определить ориентацию картинки -- где «верх», а где «низ» -- чтобы оператору не требовалось вертеть головой как сыч

Метаданные можно менять, их может не быть, они могут быть сфальсифицированы – и это может добавить проблем. Насколько это будет полезно именно Вам – судите сами.

Моя работа тут состоит из двух частей. Во-первых, это описание моего опыта разработки и прикладного использования, которые надеюсь, должны быть интересны сообществу. Во-вторых, это презентация обработки для чтения метаданных, которую можно использовать в своих целях. Исходный код открыт (Apache 2.0). Я надеюсь, что решение будет развиваться в рамках opensource-проекта. Пожалуйста, ставьте звезды на infostart и в github.

Как это ваще блин устроено?

Как известно, GPS-метки хранятся в файле картинки JPEG в особой секции двоичных данных – EXIF.

Решение всегда было на поверхности, с момента, когда в 8.3.9 появились объекты для работы с двоичными данными. Однако чтение EXIF - низкоуровневая задача, которая требует погружения в скучные технические нюансы и утомительного всматривания в HEX-коды. Существующие публикации на эту тему используют сторонние технологии, которые делают всю «грязную работу».

Есть энтузиасты, которые в рамках закрытых внедрений, разрабатывали похожие решения на 1С, но в открытом доступе на момент написания статьи их нет. 

 
"чтение EXIF" <> "чтение метаданных"

Пожалуй единственным доступным релевантным источником является пример с сайта ИТС по получению размера картинки. Этот пример работает молниеносно, заставляет апологетов 1С радоваться за платформу (могёт!!), но оставляет больше вопросов чем ответов.

 
 Ознакомление с кодом

Чтобы разобраться в природе магических чисел я проследовал по ссылкам в комментариях к коду и в итоге нашел обстоятельный стандарт с примерами и другие полезных ресурсы .

Начнем разбираться.

Любой файл состоит из двоичных данных (привет, кэп!). Даже шапочного понимания достаточно, чтобы догадаться о существовании «служебных» последовательностей в файле, которые определяют формат, содержимое и другие аспекты. Двоичные данные, определяющие формат файла называются сигнатурой файла. За редким исключением, сигнатура -- это первые несколько байт файла. У наших картинок это два байта: ff d8 - в шестнадцатеричном и 255 216 – в десятичном представлении. Теперь должна быть понятна природа магических цифр – воспринимать их нужно не как значения, а как "ключевые слова". Кроме того, теперь понятно - чтобы не искать GPS картинок в файлах нерелевантного формата, достаточно проверить только сигнатуру файла.

 
 Код

Именно это полезное свойство можно использовать в своих сервисах, принимающих файлы. Можно отсекать неподходящие файлы (пустые архивы, неверный формат файла и т.п), не сохраняя их на диск.

Вообще говоря, файл JPEG логически можно разбить на множество секций. Я приведу пример, как может быть закодирован фрагмент простого JPEG-файл, из него должна быть понятна общая логика построения файловых секций:

Можно увидеть, что секции кодируются ключевыми маркерами и длиной. Длина указывается с учетом байтов, кодирующих длину, т.е. например первая секция в файле (ffe0) занимает 16 (00 10) байт, включая сами байты 00 10.

Размеры изображения* можно прочитать из секции SOF0 (ffc0). Собственно, это и происходит в волшебном коде с сайта ИТС (192 – это c0). Далее в секции мы читаем её размер (00 11), 1-байтовое количество бит на пиксель (08), 2-байтовые ширину и высоту рисунка (00 01 и 00 02, т.е. мы имеем дело с рисунком 1x2 пикселя), и другую информацию (см. описание формата)

 
Для въедливых

Отдельные секции, как например EXIF, который нам интересен – кодируются по-особому.

Чтобы найти EXIF, нужно найти шестнадцатеричные байты: 45 78 69 66 00 00 (в примере на рисунке этой секции нет)позиция этих байтов будет нужна как реперная точка (назову её landmark), от которой мы в дальнейшем будем отсчитывать смещения. Дело в том, что секция EXIF, это по сути таблица, каждая строка в которой не может быть больше 12 байт. В таблице 4 колонки – Тег (2 байта), Тип тега (2 байта), Количество значений (4 байта) и Значение/Смещение (4 байта). Если значение умещается в 4 байта – то оно записывается непосредственно по месту, в противном случае по месту записывается сколько байтов нужно отсчитать от позиции landmark, чтобы найти нужное значение (или значения, если их несколько).

 
 Для въедливых

Другая особенность секции EXIF в том, что значения в этой секции могут кодироваться разным образом: little-endian и big-endian форматом, которые отличаются порядком чтения байтов в наборе. Формат задается следующим байтом сразу после EXIF.

Третья забавная особенность в том, что сразу после порядка байтов должно быть записано число 42. Просто потому что «ну вот так вот».

Затем задается размер смещения в байтах, которое нужно будет добавить к позиции landmark, чтобы найти записи этой таблицы EXIF. Поэтому критично, чтобы порядок следования байтов был прочитан корректно.

В следующих двух байтах хранится количество записей в таблице.

Четвертая особенность «таблицы» EXIF в том, что она иерархическая. Отдельные записи этой таблицы указывают не на значения, а на другие таблицы (каталоги) такой же структуры. Например, все значения GPS-информации записаны в отдельном «каталоге». Это позволяет использовать значения тегов более одного раза. Для иллюстрации тег 00 00 в контексте GPS-каталога тегов должен быть прочитан как GPS Version ID, а в контексте обычных EXIF-тегов как Interop index. В интернетах можно найти ресурсы, подробно описывающие перечень, назначение и типы данных тегов.

В любом теге форматом EXIV2 поддерживаются строго определенные типы данных. Их всего 9: Byte, Short, Long, Ratio, и их беззнаковые близнецы для кодирования чисел и отдельно стоящий ASCII для кодирования строк.

Искусственный пример. В таблице EXIF мы нашли такую запись:

a4 33 00 02 00 00 00 f9 00 00 00 78

Это означает тег “Lens Make” (a4 33), типа “ASCII” (00 02) из 249 символов (00 00 00 f9) расположен по адресу 120 (00 00 00 78) байтов от позиции landmark. Если отступить указанное количество байтов – можно найти непосредственно 249 символов ASCII.

Ровно таким же способом кодируются и GPS-геометки. В основной таблице EXIF в очередной 12-байтной записи в первых двух байтах будет записан тег 88 25, который означает что в файле есть геоданные и, в последних четырех байтах, будет записано смещение до нужного каталога. Если перейти туда – можно будет прочитать сначала количество записей в этом каталоге, а затем такие же 12-байтовые записи.

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

00 04 00 05 00 00 00 03 00 00 00 C0

00 04 – Долгота

00 05 – Тип Ratio

00 00 00 03 – Три значения (Градусы, минуты, секунды)

00 00 00 C0 – в 192 байтах от landmark

А в 192 байтах от landmark-байта можно будет прочитать например

00 00 00 2d 00 00 00 01 00 00 00 0d 00 00 00 01 00 00 70 30 00 00 27 10

Что можно записать условно как:

00 00 00 2d / 00 00 00 01; 00 00 00 0d / 00 00 00 01; 00 00 70 30 / 00 00 27 10

Что равно:

45 / 1; 13 / 1; 28720 / 10000

Что означает:

45 градусов 13 минут 2.872 секунды, вуаля. Мы прочитали GPS-метку!

Open source

Всё вышеописанное реализовано в виде внешней обработки

 
 Как использовать

Хотя чтение EXIF возможно и на клиенте, существующий код в данный момент серверный, потому что в моем случае файлы лежат на сервере вместе с 1С. Клиентская версия кода, если потребуется, может появиться в ходе открытой разработки. Присоединяйтесь, если вы разработчик и вам интересно.

Если вы пользовались обработкой, но что-то пошло не так – оставляйте отзывы, а лучше сразу issue на github. 

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

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

Быстрый путь к метаданным

С самого начала было очевидно, что чтение должно быть довольно шустрым. И хотя полноценный бенчмарк только назревает, первое боевое использование оказалось весьма конкурентным. Случайный файл с hdd 7200 диска анализируется за 20-40 мс в «холодном» режиме, и около 10 мс в «горячем». Характерное время для хардкорных утилит – несколько миллисекунд.

Тут надо оговориться – что, время чтения сильно зависит от содержимого, и некоторые файлы могут читаться несколько секунд, даже на exiftool. И справедливо ожидать, что пакетное чтение на большом объёме в 1С может значительно уступать скомпилированным библиотекам, но порядок цифр пока радует.

EXIF GPS метаданные

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 8000 руб.

02.09.2020    122390    673    389    

716

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7342    22    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3638    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177835    1074    0    

852

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99379    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18138    6    8    

40

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28121    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23610    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. mixsture 16.04.20 16:34 Сейчас в теме
Круто, хардкорно! Но все равно остается вопрос: почему не взяли стороннюю утилиту? Например, тот же WIA (если клиент или сервер на win) даст сразу возможности и метки читать, и разрешения менять и много чего еще. Причем строчек в 10 кода.
3. утюгчеловек 38 16.04.20 17:31 Сейчас в теме
Мы с коллегами сначала почти так и сделали. Прельстила перспектива внести решение в ландшафт 1С плюс разобраться самому - убил двух зайцев)
В идеале хотелось бы докрутить эту обработку на чтение/редактирование. Чтобы в конфигураторе в 10 строчек кода всё красиво получалось.
2. VKislitsin 960 16.04.20 17:18 Сейчас в теме
На мой взгляд, отличная демонстрация возможностей работы с двоичными данными. И не абстрактно, а на примере практической задачи.
Удивительно, что плюсов совсем мало...
А за доказательство что "да 1С так сможет!" я бы и еще пару-тройку плюсов поставил - жаль не получается.
утюгчеловек; +1 Ответить
4. утюгчеловек 38 16.04.20 17:40 Сейчас в теме
(2) Двоичные данные в целом - пугают. Из-за этого мало плюсов, я думаю
Есть интуитивное ощущение, что инструменты работы с двоичными данными сильно недооценены сообществом. Еще с 8.3.9 думал, что "ну, сейчас начнется...", но пока мало хороших публикаций.
Мне вот эта нравится: https://infostart.ru/public/1061803/
5. RomanCrow13 111 04.12.20 07:29 Сейчас в теме
Статья очень интересная!
Формат jpeg не изучал, да и в принципе препарация двоичных данных в 1С не требовалась.
Предположу, что, если в файле содержится таблица с адресами пикселей и соответствующим цветом (хотя jpeg это же сжатый формат, как-то это нужно тоже учесть), то можно на чистом 1С на вход получить ДД, и вывести в соответствии с этой таблицей само изображение.
6. утюгчеловек 38 04.12.20 13:16 Сейчас в теме
(5) Грубо говоря так и есть, но не для jpeg, как ты правильно заметил, а для png
7. SAShikutkin 5 06.08.21 11:57 Сейчас в теме
Если есть ссылка на GitHub, то может имеет смысл сделать обработку бесплатной?
8. CaSH_2004 372 28.09.22 13:24 Сейчас в теме
Очень интересно, Хочу уточнить тем кто скачал отсюда обработку:
EXIFReader1C/EXIFReader.epf at master · cashir101/EXIFReader1C · GitHub
Для запуска нужно не только версия платформы, но и чтобы в конфигурации был нужный Режим совместимости, чтобы не выяснять какой я просто сделал пустую конфигурацию и выставил Не использовать. Но даже после смены Режима совместимости конфигурации синтаксический контроль ругался вот так:
ВнешняяОбработка.EXIFReader.МодульОбъекта(949,17)}: Процедура или функция с указанным именем не определена (BitwiseShiftRight)
.
Переоткрытие Конфигуратора помогло.
Тестировал на 1С:Предприятие 8.3 (8.3.20.1590), но можно и более старую (например 8.3.11.2867), но точно не скажу версию чтобы не ошибиться.
silberRus; +1 Ответить
11. утюгчеловек 38 21.10.22 08:02 Сейчас в теме
(8) Спасибо! Поправил readme на github. Для работы требуются функции платформы для работы с двоичными данными и некоторые стандартные функции, сигнатуры которых изменились. Версия платформы должна быть не ниже 8.3.6.1977.
9. silberRus 72 20.10.22 09:57 Сейчас в теме
Сперва скачал с гита, протестил все ок, у меня сработало то что мне надо.
Потом скачал тут просто так чтобы поддержать автора, так как очень помог.

Спасибо, вы меня прям выручили с моим сайтом!, а то объявления люди кидали на сайт с кривыми картинками ) теперь норм.
утюгчеловек; +1 Ответить
10. утюгчеловек 38 21.10.22 07:55 Сейчас в теме
(9) Рад стараться)
Буду рад услышать обратную связь с критикой: что не удобно, чего не хватает?
Оставьте свое сообщение