【发布时间】:2014-09-19 03:55:49
【问题描述】:
我发现了一个我无法调试但我想解决的有趣问题,因为它对于开发我需要的小工具至关重要。
基本上所有都归结为我加载到SDL_Surface 一个加载了IMG_Load("filename.png") 的PNG。代码的骨架是
surface = IMG_Load("filename.png");
然后此工具应通过应用颜色映射(这只是一个unordered_map<u32,u32>)将这个表面逐个像素地复制到另一个表面。这基本上是可行的,但是许多像素的 RGB 值略有变化,因此这种替换失败了。
例如,当像素 255,255,255 正确存储为表面中的 0xFFFFFFFF 时,另一个像素,例如 81,60,48 变为 82,62,51。我考虑过 gamma 校正,但图像本身没有绘制,因为颜色开关是在两个表面之前应用的,而后者在之后被绘制到纹理上。
有什么线索吗?我没有兴趣为我的问题找到另一种解决方案,因为我需要能够使用固定地图进行精确的像素颜色切换,我只是想了解为什么会发生这种情况(因为 PNG 应该只包含确切的值,被无损)并解决它。
【问题讨论】:
-
您的显示器是否应用了某种颜色校准?
-
@Mark Ransom:不,我在 OSX 上运行,它有默认校准。事实上,我试图通过
SDL_GetWindowGammaRamp获得默认的伽马斜坡,但这些值似乎只是线性的。我想强调一个事实,即我正在处理原始数据,显示它只是一个后期阶段。