Добавление коррекции профиля камеры в 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, но достаточно близко. Также различия между камерами исчезли!:)

Вы должны добавить профиль в свой негатив с negative->AddProfile(profile);,

Мой проект raw2dng делает это (и больше) и доступен в исходном коде, если вы хотите увидеть пример. Профиль добавлен здесь.

Другие вопросы по тегам