PNG 伽玛校正

PNG Gamma Correction

我使用 DirectXTex 库捕获了 DX11 游戏的屏幕截图并将其保存到文件中。问题是当我将它保存为 jpeg 时效果很好,但如果我将它保存为 png 图像会变得非常明亮并被洗掉。我使用 TweakPNG 检查图像,发现伽马设置为 1.0,这就是导致问题的原因。 我检查了一些其他软件拍摄的图像,包括截图工具,它们似乎使用 0.45455 作为伽马,或者他们完全忽略了伽马值。

我不知道 DirectXTex 是否会让我指定伽玛值。我什至不确定 WIC 是否具有此功能,因为我似乎无法在 MSDN 或其他站点上找到有用的信息。

默认情况下,如果格式为 DXGI_FORMAT_*_SRGBDirectXTex 会将 sRGB 块添加到其写入的 PNG 文件中。此外,如果格式是 not DXGI_FORMAT_*_SRGB 我明确删除 sRGB 块并将 gAMA 块设置为 1.0 因为否则 WIC always 添加 sRGB 块。

您可以在两个 DirectXTexWIC.cpp and in the DirectX Tool Kit's ScreenGrab.cpp 模块的代码中看到此行为。

如果您没有在渲染目标为 DXGI_FORMAT_*_SRGB 格式但具有 DXGI_FORMAT_* 格式的 sRGB 内容的情况下进行 'gamma-correct' 渲染,那么我的建议是您传递 sRGB函数格式的版本。

在 DirectXTex 中,使用 MakeSRGB 函数可以轻松完成。

Gamma correction in the PNG format is a bit of a mess. See this blog post