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

How to load a sf::Image from an array of pixels in SFML?

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

{
 {{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 像素的图像,但是,翻转图像的 宽度高度 传递给 sf::Image::create() 的参数,如:

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

这会生成 2x3 像素的图像:

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