ビットマップの読み込み、変更、および表示方法を理解するために一日中仕事をしなければなりませんでした。ここに私の作業プログラム(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()によって返されたポインタは「読み込み専用」になりました。そのため、ピクセルデータを別の配列に入れて変更する必要がありました。 –
見つけたのは –