Вверх ↑
Этот топик читают: Гость
Ответов: 1926
Рейтинг: 172
#1: 2018-09-24 11:32:33 ЛС | профиль | цитата
25.10.2018 компонент обновлён на SVN, так что теперь берите только оттуда.
http://svn.hiasm.com/packs/delphi/conf/Jpeg.ini
http://svn.hiasm.com/packs/delphi/code/Exif.pas
http://svn.hiasm.com/packs/delphi/code/hiJpeg.pas
Пример

Обновлён модуль Exif и компонент Jpeg (версия 1.2).

Что нового:
- исправлены ошибки с нахождением раздела Exif, чтения нек-ых тегов
    Теперь работает даже лучше, чем ShowExif!
- учитывается порядок байт (биг/литтл)
- учитывается кол-во тегов
- 71 свойство
свойства
ExifValid=Наличие Exif в файле
Description=Описание картинки
Make=Производитель записывающего устройства
Model=Модель устройства
Software=Название и версия программного обеспечения записывающего устройства
Artist=Имя владельца камеры, фотографа или создателя изображения
Orientation=Ориентация картинки в текстовом виде
OrientationN=Ориентация картинки
DateTime=Дата и время изменения картинки
Copyright=Копирайт
ExifVersion=Версия Exif
UserComments=Комментарии
DateTimeOriginal=Дата и время создания исходного изображения
DateTimeDigitized=Дата и время оцифровки изображения
OffsetTime=Смещение от UTC для DateTime
OffsetTimeOriginal=Смещение от UTC для DateTimeOriginal
OffsetTimeDigitized=Смещение от UTC для DateTimeDigitized
SubSecTime=Доли секунд для DateTime
SubSecTimeOriginal=Доли секунд для DateTimeOriginal
SubSecTimeDigitized=Доли секунд для DateTimeDigitized
ExposureTime=Время экспозиции (выдержка), с
FNumber=Число диафрагмы
ExposureProgram=Класс программы для установки экспозиции
SpectralSensitivity=Строка, указывающая спектральную чувствительность каждого канала устройства
PhotographicSensitivity=Чувствительность устройства при съёмке изображения (ISOSpeedRatings).
SensitivityType=Указывает, какой параметр записан в PhotographicSensitivity
StandardOutputSensitivity=Стандартное значение выходной чувствительности устройства
RecommendedExposureIndex=Рекомендуемое значение индекса экспозиции устройства
ISOSpeed=Значение ISO-светочувствительности устройства
ISOSpeedLatitudeyyy=
ISOSpeedLatitudezzz=
ShutterSpeedValue=Скорость затвора в APEX-единицах
ApertureValue=Число диафрагмы в APEX-единицах
BrightnessValue=Значение яркости в APEX-единицах
ExposureBiasValue=Смещение экспозиции в APEX-единицах
MaxApertureValue=Минимальное число F объектива (т.е. максимально открытая диафрагма). в APEX-единицах
SubjectDistance=Расстояние до объекта, м
MeteringMode=Режим замера
LightSource=Вид источника света
Flash=Состояние вспышки
FocalLength=Фактическое фокусное расстояние объектива, мм
FlashEnergy=Энергия вспышки при съёмке, измеренная в BCPS (Beam Candle Power Seconds)
FocalPlaneXResolution=Количество пикселей по ширине на фокальной плоскости камеры
FocalPlaneYResolution=Количество пикселей по высоте на фокальной плоскости камеры
FocalPlaneResolutionUnit=Единица измерения для FocalPlane*Resolution
ExposureIndex=Индекс экспозиции устройства
SensingMethod=Тип датчика изображения
FileSource=Источник изображения
ExposureMode=Режим экспозиции
WhiteBalance=Режим баланса белого
DigitalZoomRatio=Коэффициент цифрового увеличения
FocalLengthIn35mmFilm=Эквивалентное фокусное расстояние для 35-миллиметровой пленочной камеры, мм
SceneCaptureType=Тип снимаемой сцены
GainControl=Степень общей регулировки усиления изображения
Contrast=Направление обработки контрастности при съёмке
Saturation=Направление обработки насыщения при съёмке
Sharpness=Направление обработки резкости при съёмке
SubjectDistanceRange=Расстояние до объекта
Temperature=Температура окружающей среды при съёмке, °C
Humidity=Влажность окружающей среды при съёмке, %
Pressure=Давление окружающей среды при съёмке, гПа
WaterDepth=Глубина под водой при съёмке, м. Отрицательные значения подразумевают высоту над водой
Acceleration=Ускорение (без знака) при съёмке, мГал
CameraElevationAngle=Повышение/понижение угла ориентации камеры при съёмке, градусов
ImageUniqueID=Строка-индентификатор, уникальная для каждого изображения устройства
CameraOwnerName=Владелец устройства
BodySerialNumber=Серийный номер тела устройства (камеры)
LensSpecification=Параметры объектива
LensMake=Производитель объектива
LensModel=Имя и номер модели объектива
LensSerialNumber=Серийный номер сменного объектива
_____________________________________________________________________________________________

Но это ещё не всё. Т.к. в процессе доработки разобрался со структурой Exif, решил выложить её для понимания всем желающим.
Видео для программистов, как читать Exif: https://yadi.sk/i/RXhcCqgJtIxZjQ
Архив, содержащий:
- exif.doc, кратко описывающий структуру exif;
- схема программы exifer, которая читает exif на штатных компонентах, без IC;
- больше сотни фотографий с разными exif'ами для опытов.

Наконец, ссылки на разную документацию по теме:
- http://www.cipa.jp/std/documents/e/DC-008-Translation-2016-E.pdf
- объяснение тега MakerNote для разных камер
______________________________________________________________________________________________

Убедительная просьба к Nic-у: обновить компонент на SVN, т.к. старый содержит множество ошибок чтения exif и более непригоден к использованию!

Редактировалось 12 раз(а), последний 2019-06-28 09:08:15
карма: 9
0
Главный модератор
Ответов: 2999
Рейтинг: 396
#2: 2018-09-24 11:43:17 ЛС | профиль | цитата
3042 писал(а):
Убедительная просьба к Nic-у: обновить компонент на SVN

Только, когда nesco не сможет этого сделать, выполнив все необходимые процедуры проверки, обсуждения и тестирования.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1926
Рейтинг: 172
#3: 2018-09-24 11:50:27 ЛС | профиль | цитата
Nic, ОК, тестируйте, обсуждайте, спрашивайте
карма: 9
0
Главный модератор
Ответов: 2999
Рейтинг: 396
#4: 2018-09-24 12:17:17 ЛС | профиль | цитата
Замечу, что дополнительные теги информации, поддерживают очень многие форматы хранения данных. Будет ли добавление функционала чтения тегов только в один элемент - правильным решением? Может имеет смысл создать новый элемент, который будет более универсален. Например, есть консольная программа exiftool, которая позволяет работать с большим количеством форматов. Можно использовать в качестве backend'а для разных проектов. Что-то вроде менеджера было бы неплохо для работы с метаданными.

Редактировалось 1 раз(а), последний 2018-09-24 12:17:54
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1926
Рейтинг: 172
#5: 2018-09-24 12:25:21 ЛС | профиль | цитата
Для этого надо знать формат тегов, ведь для разных форматов данных они разные. Поэтому единый компонент создать невозможно. Более-менее универсальная вещь - компоненты вкладки Type, они дают ту базу, с которой можно составлять разные структуры для чтения/записи.

А так, например, даже mp3-тег и exif не просто непохожи - они кардинально отличаются друг от друга, и каким-то одним компонентом прочитать то и другое, к сожалению, будет нельзя.

А поскольку разные камеры и даже программы могут добавлять ещё и свои, недокументированные теги, всё осложняется в разы

Редактировалось 1 раз(а), последний 2018-09-24 12:28:13
карма: 9
0
Главный модератор
Ответов: 2999
Рейтинг: 396
#6: 2018-09-24 12:48:49 ЛС | профиль | цитата
За несколько минут мне удалось найти в интернете библиотеки для работы с Exif тегами на C#. Возможно, что для пакета Windows найти что-то подобное не просто.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1926
Рейтинг: 172
#7: 2018-09-24 13:22:01 ЛС | профиль | цитата
Для Delphi есть CCR Exif v1.5.1. Но это для VCL, а не KOL. Но к чему это, если моё обновление отлично читает почти все exif-теги? По крайне мере, смысл которых я вообще смог понять из документации.

А вот с записью всё не так просто. Потому что при перезаписи этих тегов меняются смещения у всех нижележащих, и если не знать формат данных какого-то тега, то можно испортить эти данные (программы не смогут потом их прочесть).

Так что я не ставил задачу объять всё, а только исправить ошибки и попутно добавить новые теги. А кому хочется большего - программа exifer (схема в архиве) в помощь, и любой может сам читать/записывать/добавлять теги на штатных компонентах. Если, конечно, знает, что именно читать и добавлять
карма: 9
0
Ответов: 4630
Рейтинг: 749
#8: 2018-09-24 14:28:29 ЛС | профиль | цитата
3042 писал(а):
Потому что при перезаписи этих тегов меняются смещения у всех нижележащих, и если не знать формат данных какого-то тега, то можно испортить эти данные
А что, там нет возможности узнать длину данных независимо от формата? Или другими словами - как теги отделяются один от другого? То-есть, если программе какой-то тег неизвестен, она его пропускает - а для этого нужно знать длину данных.
карма: 26

0
Ответов: 1926
Рейтинг: 172
#9: 2018-09-24 14:56:00 ЛС | профиль | цитата
Netspirit писал(а):
как теги отделяются один от другого

Дело в том, что в exif древовидная структура. И под каким-то тегом может оказать целое дерево вложенных тегов (например, тот же MakerNote, куда каждая камера может писать, что ей вздумается). При чтении его можно просто пропустить, а вот при добавлении сверху новых тегов меняются смещения внутри этого дерева, и новые значения нужно записать в теги. А мы не знаем, что конкретная камера туда записала.

А сами теги и их значения хранятся раздельно. Т.е. сначала идут теги друг за другом, в них указаны только параметры (напр., выдержка, диафрагма и пр.) и смещения к значениям, но не сами значения. А значения идут уже после всех тегов. Вот из-за этого такая путаница.

В видео я как раз говорю об этом.

ps. А ещё некоторые камеры любят отходить от стандартов. Во некоторых файлах видел, что в стандарте указан один размер для значения какого-то тега, а камера записала совсем другой.

Редактировалось 1 раз(а), последний 2018-09-24 15:00:49
карма: 9
0
Ответов: 4630
Рейтинг: 749
#10: 2018-09-24 15:28:10 ЛС | профиль | цитата
Вероятно, нужно полностью считывать все теги и их данные в виде того самого "дерева", только для каждого элемента высчитывать в процессе чтения и прописывать размер (как разницу смещения между текущим и следующим). Затем при записи вычислять и прописывать новые смещения для тега как "смещение предыдущего + размер предыдущего".

Редактировалось 1 раз(а), последний 2018-09-24 15:29:08
карма: 26

0
Ответов: 1926
Рейтинг: 172
#11: 2018-09-24 15:35:02 ЛС | профиль | цитата
Netspirit писал(а):
полностью считывать все теги и их данные в виде того самого "дерева"

Проблема как раз в том, что мы можем не знать, что это "дерево". Для стандартных тегов - да, мы знаем это, но для нестандартных (к-ые знает только сама камера) мы не сможем узнать, "дерево" это (т.е. внутри есть теги, для к-ых надо пересчитывать смещение), или просто линейное значение (например, просто последовательный набор каких-то чисел, к-ые надо записывать в неизменном виде).

И ещё раз повторюсь
3042 писал(а):
я не ставил задачу объять всё, а только исправить ошибки и попутно добавить новые теги.

карма: 9
0
Ответов: 4630
Рейтинг: 749
#12: 2018-09-24 15:43:01 ЛС | профиль | цитата
Понятно.
карма: 26

0
Ответов: 1926
Рейтинг: 172
#13: 2018-09-25 12:03:16 ЛС | профиль | цитата
Так что там с обновлением на SVN? nesco, отзовись.

Редактировалось 2 раз(а), последний 2018-09-25 12:04:14
карма: 9
0
Ответов: 1926
Рейтинг: 172
#14: 2018-09-26 17:30:28 ЛС | профиль | цитата
Внимание! 26.09.18 компонент перезалит, т.к. исправлена небольшая ошибка. Кто качал себе - перекачайте!

Ссылка в первом посте (в тексте, а не во вложении).

Редактировалось 1 раз(а), последний 2018-09-26 17:31:08
карма: 9
0
Ответов: 1926
Рейтинг: 172
#15: 2018-10-19 23:47:41 ЛС | профиль | цитата
Внимание! 20.10.18 компонент обновлён (добавлена новая точка для MT-потока). Кто качал себе - перекачайте!

Ссылка в первом посте (в тексте, а не во вложении).
ps. Опять компонент из будущего

Редактировалось 4 раз(а), последний 2018-10-20 00:01:44
карма: 9
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)