Добавление коррекции профиля камеры в dng_validate.exe [Adobe DNG SDK]
Используя Lightroom, я знаю, как применить профиль камеры (файл *.dcp) к моему изображению *.DNG.
Я хотел бы сделать то же самое в приложении, которое я пишу, поэтому я думаю, что хорошей отправной точкой было бы добавить эту функцию в приложение dng_validate.exe.
Итак, я начал добавлять:
#include "dng_camera_profile.h"
Затем добавил:
static dng_string gDumpDCP;
И добавьте следующее к сообщению об ошибке:
"-dcp <file> Load camera profile from <file>.dcp\"\n"
Затем я добавил функцию для чтения dcp из cli:
else if (option.Matches("dcp", true))
{
gDumpDCP.Clear();
if (index + 1 < argc)
{
gDumpDCP.Set(argv[++index]);
}
if (gDumpDCP.IsEmpty() || gDumpDCP.StartsWith("-"))
{
fprintf(stderr, "*** Missing file name after -dcp\n");
return 1;
}
if (!gDumpDCP.EndsWith(".dcp"))
{
gDumpDCP.Append(".dcp");
}
}
Затем я загружаю профиль с диска [строка 421]:
if (gDumpTIF.NotEmpty ())
{
dng_camera_profile profile;
if (gDumpDCP.NotEmpty())
{
dng_file_stream inStream(gDumpDCP.Get());
profile.ParseExtended(inStream);
}
// Render final image.
.... rest of code as it was
Так как же теперь использовать данные профиля для исправления рендера и записи исправленного изображения?
2 ответа
Поэтому, поиграв пару дней, я нашел решение. На самом деле негатив может иметь несколько профилей камеры. Так с negative->AddProfile(profile)
Вы просто добавляете один. Но это не будет использоваться, если это не первый профиль! Поэтому сначала нужно очистить профили, а затем добавить один.
AutoPtr<dng_camera_profile> profile(new dng_camera_profile);
if (gDumpDCP.NotEmpty())
{
negative->ClearProfiles();
dng_file_stream inStream(gDumpDCP.Get());
profile->ParseExtended(inStream);
profile->SetWasReadFromDNG();
negative->AddProfile(profile);
printf("Profile count: \"%d\"\n", negative->ProfileCount()); // will be 1 now!
}
Следующая вещь, чтобы получить изображение правильно, это иметь правильный баланс белого. Это может быть сделано в камере или после. Для моего приложения с 4 разными камерами, результат был лучшим при использовании последующей коррекции баланса белого. Итак, я нашел 4 пары (температура, оттенок), используя Lightroom.
Вопрос был в том, как добавить эти значения в программу dng_validate.exe. Я сделал это так:
#include "dng_temperature.h"
if (gTemp != NULL && gTint != NULL)
{
dng_temperature temperature(gTemp, gTint);
render.SetWhiteXY(temperature.Get_xy_coord());
}
Получающиеся изображения немного отличаются от результата Lightroom, но достаточно близко. Также различия между камерами исчезли!:)