我发现了一个有趣的事情,我无法调试,但我想解决,因为它对我开发一个小工具至关重要。
基本上所有这些都减少了我加载到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应该包含精确值,无损)并解决它。
答案 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中(或者更确切地说,只是一个带有自定义值的版本)。