c++ - 如何从 SFML 中的像素数组加载 sf::Image?

标签 c++ sfml

我想从 2d 数组加载 sfml 中的图像,每个像素 (RGB) 包含 3 个值。该数组看起来像这样:

{
 {{255, 255, 255}, {255, 255, 255}},
 {{255, 255, 255}, {255, 255, 255}}
}

上面的数组描述了一个 2x2 的白色图像。如何将其转换为 sfml 中的图像 (sf::Image)?

最佳答案

如果您想从像素数组创建 sf::Image 对象,那么您会对 sf::Image::create() 感兴趣。采用 const Uint8 * 的成员函数重载:

void sf::Image::create(unsigned int width, unsigned int height, const Uint8 * pixels);  

顾名思义,最后一个参数 pixels 对应于您要从中创建 sf::Image 的像素数组。请注意,假设此像素阵列位于 RGBA format 中。 (这与问题代码中建议的 RGB 格式形成对比)。也就是说,该数组必须为每个像素保存四个Uint8 - 即每个组件都有一个Uint8: 红色绿色蓝色alpha


例如,考虑以下像素数组,pixels,由六个像素组成:

const unsigned numPixels = 6;
sf::Uint8 pixels[4 * numPixels] = {
    0,   0,   0,   255, // black
    255, 0,   0,   255, // red
    0,   255, 0,   255, // green
    0,   0,   255, 255, // blue
    255, 255, 255, 255, // white
    128, 128, 128, 255, // gray
};

然后,我们可以从 pixels 像素数组创建一个 sf::Image 对象:

sf::Image image;
image.create(3, 2, pixels);

上面创建的sf::Image的像素将对应于这些:

3x2 image

这是一个 3x2 像素图像,但是,翻转图像的 宽度高度 参数传递给 sf::Image::create() 如下所示:

sf::Image image;
image.create(2, 3, pixels);

这会产生 2x3 像素图像:

3x3 image

但是请注意,上面的两个 sf::Image 对象都是从同一个像素数组 pixels 创建的,并且它们都由 六个像素——像素的排列方式不同,因为图像具有不同的尺寸。尽管如此,像素是相同的:黑色、红色、绿色、蓝色、白色和灰色像素。

关于c++ - 如何从 SFML 中的像素数组加载 sf::Image?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63947352/

相关文章:

c++ - 向字符串类添加函数

c++ - 获取运行文件名:argv[0] vs boost::filesystem::current_path()

c++ - 递归概念的澄清

c++ - 使用 std::function 从无对象调用非静态方法

c++ - SFML 平铺 vector 下标超出范围

具有重叠矩形的 C++ 碰撞检测

c++ - 旋转矩阵的问题(openGL/glm)

c++ - 如何在 C++ 中正确读取欧洲字符(从文件和命令 shell)?

c++ - SFML 窗口没有响应

c++ - 我可以在 C++ 中有一个 "type of types"吗?