我使用了DirectXTex
库来捕获DX11游戏的屏幕截图并将其保存到文件中。问题是,当我将其另存为jpeg时,它的效果很好,但如果将其另存为png,则图像将变得超亮并褪色。我使用TweakPNG
检查了图像,发现gamma设置为1.0,这就是引起问题的原因。
我检查了由其他软件(包括截图工具)拍摄的图像,它们似乎使用了0.45455作为伽马,或者完全忽略了伽马值。
我不知道DirectXTex
是否可以让我指定伽玛值。我什至不确定WIC
是否具有此功能,因为我似乎无法在MSDN或其他站点上找到有用的信息。
答案 0 :(得分:3)
默认情况下,如果格式为sRGB
,DirectXTex会将PNG
块添加到它写入的DXGI_FORMAT_*_SRGB
文件中。此外,如果格式为 not DXGI_FORMAT_*_SRGB
,则我明确删除sRGB
块并将gAMA
块设置为1.0,因为否则WIC总是 添加sRGB
块。
您可以在DirectXTexWIC.cpp和DirectX Tool Kit的ScreenGrab.cpp模块的代码中看到此行为。
如果在渲染目标为DXGI_FORMAT_*_SRGB
格式但sRGB内容为DXGI_FORMAT_*
格式的情况下不进行“伽玛校正”渲染,那么我建议您通过sRGB版本函数的格式。
在DirectXTex中,使用MakeSRGB
函数很容易做到这一点。
PNG格式的伽玛校正有些混乱。参见this blog post