SDL2 / SDL图像奇怪的PNG行为与RGB值
SDL2 / SDL Image strange PNG behavior with RGB values
我发现了一件有趣的事情,我无法调试,但我想解决,因为它对我需要的一个小工具的开发至关重要。
基本上都归结为我在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_Image
的ImageIO.m
并从源重新构建它,问题自行解决。我想知道为什么它没有包含在SDL_Image中(或者更确切地说,只是一个带有自定义值的版本)。
相关文章:
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 在CToolBar对象中使用PNG时出现问题
- 在 C++ 中将 RGB 更改为灰度
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- Qt中的RGB图像处理
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 无法获取要在 OpenGL ES2 中显示的 RGB 纹理
- 如何将 MJPEG 解码为原始 RGB(或 YUV)数据
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 如何使用 C++将 2D RGB 数组转换为 dds 文件?
- 将 FFMPEG 帧写入 png/jpeg 文件
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 在RAW图像中提取RGB通道值的库或方法
- 如何启用libMagick++以保存.png文件格式
- Qt-png图像未显示在部署应用程序中
- 将Kinect v2帧速率(rgb、深度、骨架)设置为每秒25帧
- 加载RGB PNG会导致黑色图像
- SDL2 / SDL图像奇怪的PNG行为与RGB值