向dng_validate.exe[Adobe dng SDK]添加摄像头配置文件校正

向dng_validate.exe[Adobe dng SDK]添加摄像头配置文件校正,sdk,adobe,dng,Sdk,Adobe,Dng,使用Lightroom,我知道如何将相机配置文件(*.dcp文件)应用于我的*.DNG图像 我想在我正在编写的应用程序中也这样做,所以我想一个好的起点是将此功能附加到dng_validate.exe应用程序 所以我开始补充: #include "dng_camera_profile.h" 然后加上: static dng_string gDumpDCP; 并将以下内容添加到错误打印: "-dcp <file> Load camera profile from <fil

使用Lightroom,我知道如何将相机配置文件(*.dcp文件)应用于我的*.DNG图像

我想在我正在编写的应用程序中也这样做,所以我想一个好的起点是将此功能附加到dng_validate.exe应用程序

所以我开始补充:

#include "dng_camera_profile.h"
然后加上:

static dng_string gDumpDCP; 
并将以下内容添加到错误打印:

"-dcp <file>   Load camera profile from <file>.dcp\"\n"

那么,我现在如何使用配置文件数据来校正渲染和写入校正后的图像呢?

您需要使用
负片->添加配置文件(配置文件)将配置文件添加到负片中


我的项目可以做到这一点(以及更多),如果您想查看示例,可以在源代码中找到。配置文件已添加。

您需要使用
负片->添加配置文件(配置文件)将配置文件添加到负片中


我的项目可以做到这一点(以及更多),如果您想查看示例,可以在源代码中找到。配置文件已添加。

因此,在玩了几天之后,我现在找到了解决方案。实际上,底片可以有多个相机配置文件。因此,使用
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!
}

结果图像与Lightroom结果略有不同,但足够接近。此外,相机之间的差异现在消失了!:)

所以在玩了几天之后,我现在找到了解决办法。实际上,底片可以有多个相机配置文件。因此,使用
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!
}

结果图像与Lightroom结果略有不同,但足够接近。此外,相机之间的差异现在消失了!:)

我已经编译了您的程序,并从DNG文件和pcf文件生成了一个*.jpg。结果与我从dng_validate.exe获得的结果相同。我还在dng_validate.exe中添加了负片->AddProfile(profile),但它不会更改输出tiff。这些文件与Lightroom的结果不同。请参阅:运行您的程序时,dng文件出现以下错误:
-正在分析原始文件…
错误:目录Nikon1中的25665个条目被视为无效;不读书。对于原始*.NEF文件:
-正在处理元数据…
-->错误!(无效的标记名或ifdId`ImageWidth',ifdId 83)原始文件:,相机配置文件:相机配置文件使用dcpTool转换为xml。此外,对于我来说,使用和不使用nikon.dcp时,raw2dng的输出是相同的。因此,从image.dng->raw2dng.jpg。但在Lightroom中,nikon.dcp文件明显改善了图像。结果没有错,只是不同而已。开发原始文件不是一门精确的科学,但涉及各种(部分特定于相机的)假设。似乎Adobe决定对Lightroom中的NEF应用一些亮度提升。如果你使用另一个专业的原始开发人员,你可能会得到稍微不同的结果。我已经编译了你的程序,并从DNG文件和pcf文件生成了一个*.jpg。结果与我从dng_validate.exe获得的结果相同。我还在dng_validate.exe中添加了负片->AddProfile(profile),但它不会更改输出tiff。这些文件与Lightroom的结果不同。请参阅:运行您的程序时,dng文件出现以下错误:
-正在分析原始文件…
错误:目录Nikon1中的25665个条目被视为无效;不读书。对于原始*.NEF文件:
-正在处理元数据…
-->错误!(无效的标记名或ifdId`ImageWidth',ifdId 83)原始文件:,相机配置文件:相机配置文件使用dcpTool转换为xml。此外,对于我来说,使用和不使用nikon.dcp时,raw2dng的输出是相同的。因此,从image.dng->raw2dng.jpg。但在Lightroom中,nikon.dcp文件明显改善了图像。结果没有错,只是不同而已。开发原始文件不是一门精确的科学,但涉及各种(部分特定于相机的)假设。似乎Adobe决定对Lightroom中的NEF应用一些亮度提升。如果您使用另一个专业的原始开发人员,您可能会得到稍微不同的结果。
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!
}
if (gTemp != NULL && gTint != NULL)
{
    dng_temperature temperature(gTemp, gTint);
    render.SetWhiteXY(temperature.Get_xy_coord());
}