C++ PNG伽马校正

C++ PNG伽马校正,c++,directx-11,wic,directxtk,C++,Directx 11,Wic,Directxtk,我使用DirectXTex库捕获DX11游戏的屏幕截图并将其保存到文件中。问题是,当我将其保存为jpeg时,效果非常好,但如果我将其保存为png,则图像将变得超亮并褪色。我使用TweakPNG检查了图像,发现gamma设置为1.0,这就是导致问题的原因。 我检查了一些其他软件(包括剪切工具)拍摄的图像,它们似乎使用0.45455作为gamma,或者它们完全忽略了gamma值 我不知道DirectXTex是否允许我指定gamma值。我甚至不确定WIC是否具有此功能,因为我似乎无法在MSDN或其他网

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

我不知道
DirectXTex
是否允许我指定gamma值。我甚至不确定
WIC
是否具有此功能,因为我似乎无法在MSDN或其他网站上找到有用的信息。

默认情况下,如果格式为
DXGI\u format\u*\u sRGB
,则将
sRGB
区块添加到它编写的
PNG
文件中。此外,如果格式不是
DXGI\u format\u*\ u SRGB
I显式删除
SRGB
块,并将
gAMA
块设置为1.0,因为否则WIC总是添加
SRGB

您可以在和的模块中的代码中看到此行为

如果在渲染目标为
DXGI\u格式\u*\ u SRGB
格式但SRGB内容为
DXGI\u格式\u*
格式的情况下,不执行“gamma correct”渲染,则我建议您将该格式的SRGB版本传递给函数

在DirectXTex中,使用
MakeSRGB
函数很容易做到这一点

PNG格式的Gamma校正有点混乱。看


谢谢你的回答。我用相应的
*\u SRGB
格式创建了一个暂存回缓冲区,它工作了。但是,我想知道您选择1.0作为gamma是否有原因?我注释掉了整个else块,在那里你设置了gamma,它也工作得很好。我认为无论怎样,
WIC
都将其视为sRGB,并使用了默认的gamma,至少在
windows10
中,它似乎“更合适”。表面可能是sRGB(近似于提高到2.2的幂次方)或“线性”(没有gamma,这与将值提高到1.0的幂次方相同)。对于现代游戏中的许多纹理,它们通常对线性数据进行编码。如果您提供了一个显式的
\u SRGB
格式,那么很明显,将其编写为SRGB是正确的。如果您没有提供
\u SRGB
格式,那么将其编写为SRGB很可能是错误的。我明白了。不过,还有一个问题<当使用
SRGB
格式时,code>Resize现在会花费很长时间。我的意思是要慢几个数量级。我检查了源代码,发现我可以指定
TEX\u FILTER\u FORCE\u WIC
,一切都会很快。我不确定这是否正确使用此选项。您使用的是调试模式还是发布模式?DirectXTex库避免将WIC用于各种格式的组合,因为在许多情况下它会做“错误的事情”,因此它在内部使用软件实现。您可以使用该标志强制使用WIC并覆盖该逻辑。我在这两个方面都进行了测试。在调试模式下,它花费了40倍的时间。在释放模式下,它要好得多,但仍然需要8倍的时间。