SDL2 / SDL使用RGB值拍摄奇怪的PNG行为

时间:2014-07-28 00:52:27

标签: c++ png sdl sdl-image

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

基本上所有这些都减少了我加载到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。我考虑过伽马校正,但由于在两个表面之前应用了颜色开关,因此不会绘制图像本身,后者在之后被绘制到纹理。

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

1 个答案:

答案 0 :(得分:3)

好的,我找到了原因并修复了它。问题在于如何通过OS X框架加载PNG。根据{{​​3}}帖子,这与this有关,embedded calibration在加载图片时以某种方式被考虑在内。建议的fix如下:

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.m的{​​{1}}并从源代码重建它,问题就解决了。我想知道为什么它没有被包含在SDL_Image中(或者更确切地说,只是一个带有自定义值的版本)。