Про Adobe DNG SDK
Вдогонку ко вчерашнему.
При рассмотрении потрохов DNG SDK (каковой, конечно же, используется в Adobe DNG Converter, другой вопрос что публичная версия могла несколько устареть) объяснение такому поведению EXIF нашлось:
- Структура dng_exif - это разобранный (в кучу полей) EXIF
- Пишется EXIF-таблица - из этой структуры.
- Соответственно
- Если поле (тег) неизвестно (ну вот OffsetTime), оно не разбирается.
- Если поле не разобрано - оно не пишется.
- Если тег известен, то он может разбираться в несколько полей dng_exif
- Так, к примеру, работает dng_exif::SetExposureTime, заполняются два поля структуры
- И они же потом и пишутся.
- А интерфейса "вот тебе готовая таблица тегов EXIF, запиши ее пожалуйста, ничего там не трогая" в DNG SDK нет.
- Мою характеристику проектировщика этого интерфейса я оставлю непроизнесенной.
Да, вот в результате как устроен код (кусок кода) программы dngconvert (взятой для примера):
getExifTag(exifData, "Exif.Photo.ComponentsConfiguration", 0, &m_Exif->fComponentsConfiguration); getExifTag(exifData, "Exif.Photo.Contrast", 0, &m_Exif->fContrast); getExifTag(exifData, "Exif.Photo.CustomRendered", 0, &m_Exif->fCustomRendered); getExifTag(exifData, "Exif.Photo.DateTimeDigitized", &m_Exif->fDateTimeDigitized); getExifTag(exifData, "Exif.Photo.DateTimeOriginal", &m_Exif->fDateTimeOriginal); getExifTag(exifData, "Exif.Photo.DigitalZoomRatio", 0, &m_Exif->fDigitalZoomRatio); getExifTag(exifData, "Exif.Photo.ExposureBiasValue", 0, &m_Exif->fExposureBiasValue); getExifTag(exifData, "Exif.Photo.ExposureMode", 0, &m_Exif->fExposureMode); getExifTag(exifData, "Exif.Photo.ExposureProgram", 0, &m_Exif->fExposureProgram); getExifTag(exifData, "Exif.Photo.ExposureTime", 0, &m_Exif->fExposureTime); getExifTag(exifData, "Exif.Photo.FileSource", 0, &m_Exif->fFileSource); getExifTag(exifData, "Exif.Photo.Flash", 0, &m_Exif->fFlash); getExifTag(exifData, "Exif.Photo.FNumber", 0, &m_Exif->fFNumber); getExifTag(exifData, "Exif.Photo.FocalPlaneResolutionUnit", 0, &m_Exif->fFocalPlaneResolutionUnit); getExifTag(exifData, "Exif.Photo.FocalPlaneXResolution", 0, &m_Exif->fFocalPlaneXResolution); getExifTag(exifData, "Exif.Photo.FocalPlaneYResolution", 0, &m_Exif->fFocalPlaneYResolution); getExifTag(exifData, "Exif.Photo.FocalLength", 0, &m_Exif->fFocalLength); getExifTag(exifData, "Exif.Photo.FocalLengthIn35mmFilm", 0, &m_Exif->fFocalLengthIn35mmFilm); getExifTag(exifData, "Exif.Photo.GainControl", 0, &m_Exif->fGainControl); getExifTag(exifData, "Exif.Photo.ISOSpeedRatings", 0, &m_Exif->fISOSpeedRatings[0]); getExifTag(exifData, "Exif.Photo.LightSource", 0, &m_Exif->fLightSource);
И это только маленький кусочек.
И вот так работает вся эта индустрия. Сначала в одной библиотеке (exiv2 в данном случае) исчисляют все теги. Потом в DNG SDK исчисляют все теги. Потом пользоваль этих библиотек сводит это говнище воедино.
И это еще ничего. Хуже когда теги нужно преобразовать. Ну вот под каждого вендора отдельно:
getExifTag(exifData, "Exif.Panasonic.LensType", &m_Exif->fLensName); getExifTag(exifData, "Exif.Panasonic.LensSerialNumber", &m_Exif->fLensSerialNumber); // Sony Makernotes if (getExifTag(exifData, "Exif.Sony2.LensID", 0, &val)) { char lensType[256]; snprintf(lensType, sizeof(lensType), "%i", val); m_Exif->fLensID.Set_ASCII(lensType); }
И так - по всем вендорам и всем особенностям. А дальше происходит ужасное:
- Вендор меняет формат makernotes. В новой камере или в новой прошивке для старой камеры.
- Авторы exiv2 далеко не сразу подпирают разбор этой новой версии
- Автор dngconvert ничего уже не подпирает потому что Latest commit 49b50d4 on Aug 24, 2011
- И появляется вот такое странное, которое вроде есть, а смысл для новых камер - утерян
При том, что EXIF-таблицу КОНЕЧНО надо просто копировать из исходного RAW в результирующий EXIF не задумываясь о ее смысле (за исключением небольшого количества полей, важных для конкретного приложения), ибо не дело конвертора обдумывать неизвестные ему поля.
И аналогично с makernotes (хотя там есть нерешаемая идеологическая проблема)
Прямо вот хоть бери напильник и правь этот самый DNG SDK, но он, сука, писан индусами (и опять же - вместо записи таблицы, foreach (entry, exifTable) write_tag_не-думая-о-его-смысле() - каждый тег пишется отдельно) и в этой миске риса с карри не так просто всунуть свое.
P.S. На фоне этого безумия даже исходники dcraw смотрятся где-то даже прилично, ибо Коффин все делал компактности для (в ущерб читаемости, конечно). Хотя это и про другое, в dcraw используются только нужные для работы метаданные.
Comments
При том, что много лет снимаю
При том, что много лет снимаю в DNG, я никогда не понимал идеи конвертировать нативные RAW'ы в DNG.
В случае DNG->DNG я тоже не
В случае DNG->DNG я тоже не понимаю (ну только если исходный - нежатый, место поэкономить).
А глобально есть два вменяемых аргумента
а) а вот когда все остальные форматы забудут - DNG еще будут помнить
б) для uncompressed - пожать, поэкономить место.
Ну и самый вменяемый:
Ну и самый вменяемый:
в) у меня старый Lr/ACR/C1/DXO, они эту камеру не поддерживают, а в DNG-виде - жрут (хотя с C1 бывают /бывали?/ приколы, когда она native raw жрет, а конвертированный DNG кажет неверно)
И что, все цвета норм в DNG
И что, все цвета норм в DNG-виде? При томи что во всех этих софтах скрытые поправки, завязанные на модели камер?
C1 вот у Pentax'а вообще только PEF жрёт, а от DNG-прямо-из-камеры с ума сходит. Что-то показывает, но лучше бы нет.
Ну, возможность DNG→DNG мне
Ну, возможность DNG→DNG мне даже в голову не приходила.
Мне эти аргументы вменяемыми не кажутся. Если в DNG полученного из CRW пересадить всю идентификацию (но не фотоданные, только идентификцию — номера моделей, производителя, прошивки, такое) от DNG полученного из NEF — оно будет правильно обрабатываться? В смысле, цвета не поплывут при конверсии адобовским же софтом?
>> цвета не поплывут при
>> цвета не поплывут при конверсии адобовским же софтом?
Хрен его знает. Городская легенда гласит, что Adobe учитывает make/model даже для DNG, хотя мне это несколько сомнительно т.к. тогда уплывали бы всякие обработанные DNG но с сохраненными make/model.
Глобально же есть варианты
а) Ничего такого особенного в vendor-specific метаданных нету, для обработки (конкретным софтом) они не нужны
б) есть, но представимо в виде DNG tags (и конкретный софт их обрабатывает) и пересажено верно
б2) то же самое, но сконвертировано неверно
в) метаданные непредставимы в виде DNG tags (ну, к примеру, выравнивание данных у PhaseOne, плюс цветовой профиль в виде LUT)
Но даже в случае в - можно в процессе конверсии что-то такое приложить и свести задачу к представимой в DNG.
Бывает что и данные (пиксели) непредставимы в DNG-виде, ну вот Sigma/Foveon Quattro.
Ну, приложить-то можно, но
Ну, приложить-то можно, но если новый софт будет понимаеть это старое приложенное, то и старый RAW он скорее всего понимать будет.
Т.е. я слабо верю в ситуацию «Древний DNG обрабатывается полностью корректно, включая заёбы старой камеры, а про фирменный формат от этой камеры забыли». Теоретически она возможна, а практически — что-то сомневаюсь. Или всё сдохнет или будут тянуть совместимость.
Одна польза от DNG может быть в архивном смысле — когда всё это забудут и ещё через 100 лет цифровые археологи будут раскапывать старые датацентры то по DNG накопается хотя бы PDF с ванильным форматом (не учитывающий никакие скрытые поправки, конечно) а по CRW не накопается ничего. Но нас это уже волновать не будет.
Я же вот в случае "в" написал
Я же вот в случае "в" написал вполне конкретное "выравнивание у PhaseOne".
Была (может и есть) куча софта (к примеру, RPP), которая выравнивать не умела, получались квадраты. А вот DNG-конвертор - выравнивал в процессе конверсии - и дальше все было ок. Естественно, при этом сами RAW-данные менялись.
Вполне возможно, что такое выравнивание (изменение данных) убивает какую-то маргинальную технику, ну скажем вычитание темнового кадра (коий нужно вычитать до выравнивания, либо при выравнивании использовать одинаковые коэффициенты).
Почему Sigma непредставима в
Почему Sigma непредставима в DNG? Лично перегонял сигму (права меррилл, но кваттро по-моему тоже той софтинкой конвертится - X3F Wrapper) в DNG и оно даже работало в Adobe софте.
Потому что у нижних слоев
Потому что у нижних слоев разрешение вдвое ниже, DNG-тегами такого не выразить.
Но, конечно "непредставима без модификации исходных данных (пикселей)". Так то - пожалуйста, R/G интерполируют на удвоенное разрешение (и точки АФ замазывают) и вроде ок.
> В случае DNG->DNG я тоже не
> В случае DNG->DNG я тоже не понимаю
частный случай же просто покоцать данные (например отключить принудительну коррекцию оптики в ACR/LR если firmware вписала тэги в родной DNG raw)
Z / V
exiftool спасает
exiftool спасает
А DNG Converter - не должен бы
да, но я про DNG -> DNG, а не
да, но я про DNG -> DNG, а не про DNG converter (который так тэги не правит конечно же) - это же не единственное ПО которое делает DNG -> DNG (с какими-либо модификациями внутри)...
Z / V
Индусам как поэтам, платят
Индусам как поэтам, платят построчно.
ну эти стихи про getExifTag -
ну эти стихи про getExifTag - это из опенсорца.
Но DNG SDK, да, очень поэтически написан. Геттеры сеттеров погоняют.