【问题标题】:SFML leaves part of texture blank, if I create it from PixelPtrSFML 将纹理的一部分留空,如果我从 PixelPtr 创建它
【发布时间】:2015-06-29 19:14:14
【问题描述】:

我有一个代码,它将纯 BGR 数据转换为 sf::Texture。 “ifs”打开 ifstream 到包含 BGR 颜色字节三元组的文件(省略源文件的标题)。并且宽度和高度 100% 有效。在我的示例中,图像是 800x600。

struct h3pcx_color_bgr { uint8_t b, uint8_t g, uint8_t r };

sf::Uint8* pixels = new sf::Uint8[width * height * 4];
h3pcx_color_bgr* fileData = new h3pcx_color_bgr[width*height]; 
ifs.read((char*)fileData, width * height * sizeof(h3pcx_color_bgr));

for (uint32_t i = 0; i < width*height; ++i) {
    pixels[i * 4] = fileData[i].r;
    pixels[i * 4 + 1] = fileData[i].g;
    pixels[i * 4 + 2] = fileData[i].b;
    pixels[i * 4 + 3] = 255;
}

这段代码运行良好,问题接踵而至。绘制纹理后:

m_tex.update(pixels); //sf::Texture
m_sprite.setTexture(m_tex); //sf::Sprite
m_window->draw(m_sprite); // m_window is sf::RenderWindow

我在下图中有一条恼人的灰线: 我做了什么:

  • 已验证,像素包含有效值

下面的代码 sn-p(700 * 595 在“灰色区域”内)显示,像素和 fileData 都包含有效数据(不是灰色,它只是显示未初始化的内存)。

auto f = fileData[700 * 595]; // 32, 31, 38
auto r = pixels[700 * 595 * 4]; // 38
auto g = pixels[700 * 595 * 4 + 1]; // 31
auto b = pixels[700 * 595 * 4 + 2]; // 32

“灰色”颜色为 204、204、204。

  • 尝试使用 sf::Image

如果我们这样做:

img.create(width, height, pixels); // img is sf::Image
img.setPixel(700, 595, sf::Color::Blue);

然后将其转换为 sf::Texture,然后进行绘制。结果将是相同的带有灰色区域的图像,但像素 700、585 将是蓝色的!

如果我从“灰色区域”获取颜色值:

auto clr = img.getPixel(700,600); //sf::Color(204,204,204)

所以,看起来,像素数量有一些硬限制(???)(但我对此表示怀疑,因为我查看了实际的 SFML 代码,并没有发现任何可疑之处)或者我的愚蠢错误。如果有人能指出,我将非常感激 - 为什么会出现这条灰线。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    在代码中:

    auto f = fileData[700 * 595];
    

    您正在访问像素 500、520。要访问像素 700、595,您必须使用:

    auto f = fileData[700 + 595 * 800]; // x + y * width
    

    我会写这篇评论,但我缺乏必要的声誉。

    【讨论】:

      【解决方案2】:

      如果 any1 想知道 - 只是文件有误,最后是这个确切的灰色。代码是正确的。

      【讨论】:

        猜你喜欢
        • 2014-04-03
        • 2021-02-01
        • 2013-11-17
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多