【发布时间】:2017-05-13 16:05:08
【问题描述】:
我不得不整天工作以弄清楚如何加载、修改和显示位图。这是我的工作程序(Lubuntu,CodeBlocks 16.01)。我必须将这些库:-lsfml-graphics、-lsfml-window 和 -lsfml-system 添加到项目> 构建选项> 链接器设置> 其他链接器选项。有什么改进建议吗?
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
struct pix {
unsigned char r; // could use Uint8
unsigned char g;
unsigned char b;
unsigned char t;
};
// globals
pix pixarray[640][480];
Texture tex;
Sprite spr;
// functions
void loadbitmap();
void modifybitmap();
void displaybitmap();
int main() {
RenderWindow window(VideoMode(640, 480), "Modify Bitmap");
loadbitmap();
modifybitmap();
displaybitmap();
while (window.isOpen()) {
Event event;
while (window.pollEvent(event)) {
if (event.type == Event::Closed)
window.close();
}
window.clear();
window.draw(spr);
window.display();
}
return 0;
}
//-------------------------------------------------------
void loadbitmap() {
const unsigned char *pixptr;
Image img;
int i, j;
img.loadFromFile("pic.bmp");
pixptr = img.getPixelsPtr(); // notice its Pixels not Pixel
// pixptr is read only, move pixels to your array
for (i = 0; i < 640; ++i) {
for (j = 0; j < 480; ++j) {
pixarray[i][j].r = *pixptr++;
pixarray[i][j].g = *pixptr++;
pixarray[i][j].b = *pixptr++;
pixarray[i][j].t = 255;
pixptr++;
}
}
return;
}
//---------------------------------------------------------
void modifybitmap() {
// turn up red in top half of your array
int i, j;
for (i = 0; i < 320; ++i) {
for (j = 0; j < 480; ++j) {
pixarray[i][j].r = 255;
}
}
return;
}
//-------------------------------------------------------------
void displaybitmap() {
Image img;
unsigned char *ptr1;
ptr1 = &pixarray[0][0].r; // point to first byte
img.create(640, 480, ptr1);
tex.loadFromImage(img);
spr.setTexture(tex);
return;
}
【问题讨论】:
-
您有什么理由不直接使用
sf::Image吗?只需存储sf::Image::getPixelsPtr()的返回值并使用它来代替pixarray。你只需要对生命周期/锁定有点小心。 -
我试过了,但是 getPixelsPtr() 返回的指针原来是“只读的”,所以我不得不将像素数据放在另一个数组中来更改它们。
-
发现我必须这样做