如果我从 PixelPtr 创建它,SFML 会将部分纹理留空
SFML leaves part of texture blank, if I create it from PixelPtr
我有一个代码,可以将纯 BGR 数据转换为 sf::Texture。 "ifs" 打开 ifstream 到包含 BGR 颜色字节三元组的文件(省略源文件的 header)。宽度和高度 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
我在下图中有这条烦人的灰线:
我做了什么:
- 已验证,像素包含有效值
下面的代码片段(700 * 595 在 "grey area" 内)显示,pixels 和 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
"Grey" 颜色为 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 将为蓝色!
如果我从 "grey area" 获得颜色值:
auto clr = img.getPixel(700,600); //sf::Color(204,204,204)
所以,看起来,在像素数量上有一些 hard-limit(???)(但我对此表示怀疑,因为我查看了实际的 SFML 代码,并没有发现任何可疑的东西) 或我的愚蠢错误。如果有人能指出 - 为什么会出现这条灰线,我将不胜感激。
代码中:
auto f = fileData[700 * 595];
您正在访问像素 500、520。要访问像素 700、595,您必须使用:
auto f = fileData[700 + 595 * 800]; // x + y * width
我会写这个作为评论,但我缺乏必要的声誉。
如果有任何人想知道 - 只是文件有误,最后的颜色完全是灰色。代码正确。
我有一个代码,可以将纯 BGR 数据转换为 sf::Texture。 "ifs" 打开 ifstream 到包含 BGR 颜色字节三元组的文件(省略源文件的 header)。宽度和高度 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
我在下图中有这条烦人的灰线:
- 已验证,像素包含有效值
下面的代码片段(700 * 595 在 "grey area" 内)显示,pixels 和 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
"Grey" 颜色为 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 将为蓝色!
如果我从 "grey area" 获得颜色值:
auto clr = img.getPixel(700,600); //sf::Color(204,204,204)
所以,看起来,在像素数量上有一些 hard-limit(???)(但我对此表示怀疑,因为我查看了实际的 SFML 代码,并没有发现任何可疑的东西) 或我的愚蠢错误。如果有人能指出 - 为什么会出现这条灰线,我将不胜感激。
代码中:
auto f = fileData[700 * 595];
您正在访问像素 500、520。要访问像素 700、595,您必须使用:
auto f = fileData[700 + 595 * 800]; // x + y * width
我会写这个作为评论,但我缺乏必要的声誉。
如果有任何人想知道 - 只是文件有误,最后的颜色完全是灰色。代码正确。