将相机配置文件校正添加到 dng_validate.exe [Adobe DNG SDK]
Adding camera profile correction to 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"
然后我添加了从cli读取dcp的功能:
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
那么我现在如何使用配置文件数据来校正渲染并写入校正后的图像?
您需要使用 negative->AddProfile(profile);
将个人资料添加到您的底片中。
我的项目raw2dng does this (and more) and is available in source if you want to see an example. The profile is added here.
所以在玩了几天之后,我现在找到了解决方案。实际上底片可以有多个相机配置文件。因此,使用 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 台不同相机的应用,使用后期白平衡校正时效果最好。所以我使用 Lightroom 找到了 4 对(温度,色调)。
问题是如何在 dng_validate.exe 程序中添加这些值。我是这样做的:
#include "dng_temperature.h"
if (gTemp != NULL && gTint != NULL)
{
dng_temperature temperature(gTemp, gTint);
render.SetWhiteXY(temperature.Get_xy_coord());
}
生成的图像与 Lightroom 的结果略有不同,但足够接近。相机与相机之间的差异现在也消失了! :)
使用 Lightroom 我知道如何将相机配置文件(*.dcp 文件)应用到我的 *.DNG 图像。
我想在我正在编写的应用程序中做同样的事情,所以我想一个好的起点是将此功能附加到 dng_validate.exe 应用程序。
所以我开始补充:
#include "dng_camera_profile.h"
然后添加:
static dng_string gDumpDCP;
并在错误打印中添加以下内容:
"-dcp <file> Load camera profile from <file>.dcp\"\n"
然后我添加了从cli读取dcp的功能:
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
那么我现在如何使用配置文件数据来校正渲染并写入校正后的图像?
您需要使用 negative->AddProfile(profile);
将个人资料添加到您的底片中。
我的项目raw2dng does this (and more) and is available in source if you want to see an example. The profile is added here.
所以在玩了几天之后,我现在找到了解决方案。实际上底片可以有多个相机配置文件。因此,使用 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 台不同相机的应用,使用后期白平衡校正时效果最好。所以我使用 Lightroom 找到了 4 对(温度,色调)。
问题是如何在 dng_validate.exe 程序中添加这些值。我是这样做的:
#include "dng_temperature.h"
if (gTemp != NULL && gTint != NULL)
{
dng_temperature temperature(gTemp, gTint);
render.SetWhiteXY(temperature.Get_xy_coord());
}
生成的图像与 Lightroom 的结果略有不同,但足够接近。相机与相机之间的差异现在也消失了! :)