하루 종일 비트 맵을로드, 수정 및 표시하는 방법을 알아야했습니다. 여기에 제 작업 프로그램이 있습니다 (Lubuntu, CodeBlocks 16.01). 이 라이브러리를 추가해야했습니다 : -lsfml-graphics, -lsfml-window 및 -lsfml-system을 프로젝트> 빌드 옵션> 링커 설정> 다른 링커 옵션으로 추가해야했습니다. 개선을위한 제안?SFML로드, 수정, 비트 맵 표시
#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' 대신에 그것을 사용하십시오. 평생/잠금에 대해 조심해야합니다. – Mario
나는 것을 시도했지만 getPixelsPtr에 의해 반환되는 포인터는()로 밝혀 "읽기 전용"그래서 내가 그들을 변경하려면 다른 배열의 픽셀 데이터를 넣어했다. –
발견 된 나는 –