SDL2 / SDL图像奇怪的PNG行为与RGB值

SDL2 / SDL Image strange PNG behavior with RGB values

本文关键字:RGB PNG SDL 图像 SDL2      更新时间:2023-10-16

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

基本上都归结为我在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应该只是包含精确的值,是无损的),并解决它。

好的,我找到了原因并修复了。问题在于如何通过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
                                );

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