1

我发现了一个我无法调试但我想解决的有趣的事情,因为它对于开发我需要的小工具至关重要。

基本上所有都归结为我加载到一个SDL_Surface加载了IMG_Load("filename.png"). 代码的骨架是

surface = IMG_Load("filename.png");

然后这个工具应该通过应用颜色图(这只是一个)将这个表面逐个像素地复制到另一个表面unordered_map<u32,u32>。这基本上是可行的,但是许多像素的 RGB 值略有变化,因此这种替换失败了。

例如,当像素 255,255,255 正确存储为表面中的 0xFFFFFFFF 时,另一个像素,例如 81,60,48 变为 82,62,51。我考虑过伽玛校正,但图像本身没有被绘制,因为颜色开关是在​​两个表面之前应用的,而后者在之后被绘制到纹理上。

有什么线索吗?我没有兴趣为我的问题找到另一种解决方案,因为我需要能够使用固定地图进行精确的像素颜色切换,我只想了解为什么会发生这种情况(因为 PNG 应该只包含确切的值,被无损)并解决它。

4

1 回答 1

3

好的,我找到了原因并修复了它。问题在于如何通过 OS X 框架加载 PNG。根据这个线程,这与加载图像时以某种方式考虑的嵌入式校准有关。建议的修复如下:

CGFloat whitePoint[3] = { 1, 1, 1 };
CGFloat blackPoint[3] = { 0, 0, 0 };
CGFloat gamma[3] = { 2.2, 2.2, 2.2 };
CGFloat matrix[9] = {
    1, 1, 1,
    1, 1, 1,
    1, 1, 1
};
CGColorSpaceRef color_space =
    CGColorSpaceCreateCalibratedRGB(
                                whitePoint, blackPoint, gamma, matrix
                                );

通过修补ImageIO.mSDL_Image从源头重建它,问题自行解决了。我想知道为什么它没有包含在 SDL_Image 中(或者更确切地说,只是一个具有自定义值的版本)。

于 2014-07-28T01:38:17.530 回答