Speichern des OpenGL Bildes in ein BMP

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 11:40

Speichern des OpenGL Bildes in ein BMP

Beitrag von Klausn » 11. Februar 2009 17:37

Hi zusammen...

ich will ein OpenGL in ein bmp File speichern .. und nutze dazu folgenden Code:

int OpenGLLLL::uebergabe(int x, int y, int Width, int Height, const char *fname)
{

BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;

unsigned char *image = (unsigned char*)malloc(sizeof(unsigned char)*Width*Height*3);
FILE *file = fopen(fname, "wb");

if( image!=NULL )
{
if( file!=NULL )
{
int* viewport = new int[4];

glGetIntegerv(GL_VIEWPORT, viewport);
glReadPixels( x, y, Width, Height, GL_RGB, GL_UNSIGNED_INT, &image );

memset( &bf, 0, sizeof( bf ) );
memset( &bi, 0, sizeof( bi ) );

bf.bfType = 'MB';
bf.bfSize = sizeof(bf)+sizeof(bi)+Width*Height*3;
bf.bfOffBits = sizeof(bf)+sizeof(bi);
bi.biSize = sizeof(bi);
bi.biWidth = Width;
bi.biHeight = Height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biSizeImage = Width*Height*3;

fwrite( &bf, sizeof(bf), 1, file );
fwrite( &bi, sizeof(bi), 1, file );
fwrite( image, sizeof(unsigned char), Height*Width*3, file );

fclose( file );

}
free( image );
}
return 0;
}


Das funktioniert soweit auch ... aber es kommt nur ein schwarzes bild zustande mit bunten pixeln am unteren Bildschirmrand. Wenn ich makeCurrent() benutze , stürzt das komplette Programm ab ! Ich habe keine Ahnung woran das liegt. Hat vielleicht jemand eine Idee ???

androphinx
Beiträge: 170
Registriert: 26. Januar 2009 10:19
Wohnort: 127.0.0.2

Beitrag von androphinx » 12. Februar 2009 12:51

@ Moderatoren & Admins: Sorry, aber was hat der Post hier zu suchen, das ist leider kein Qt... ;)

@Klausn: Ich habe bisher aus OpenGL heraus nur mit Qt Bilder erstellt, habe deswegen keine wirkliche Idee woran es liegen könnte.

Oder vielleicht doch:
Als erstes bitte das ansehen:
http://en.wikipedia.org/wiki/Fwrite#fwrite

Daraus folgt, mache aus deinem FWrite mal:

Code: Alles auswählen

 fwrite( image, Height*Width*3, sizeof(unsigned char), file ); 
Hast du auch bei den vorherigen FWrite's so gemacht fällt mir gerade auf... (sizeof(unsigned char) == 1 ;) )

Hoffe, das hilft dir....

Mfg androphinx

solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix » 13. Februar 2009 09:13

Code: Alles auswählen

unsigned char *image = (unsigned char*)malloc(sizeof(unsigned char)*Width*Height*3);
Also erstens gibt es mittlerweile C++... da arbeitet man mit "new" und "delete"

Code: Alles auswählen

FILE *file = fopen(fname, "wb"); 
zweitens sind wir in einem Qt-Forum... da gibt's so eine hübsche Klasse "QFile"

Und drittens habe ich das bei mir mit einem Einzeiler gelöst:

Code: Alles auswählen

  renderPixmap(x,y).save(filename); // http://doc.trolltech.com/4.4/qglwidget.html#renderPixmap
Falls du noch Höhe/Breite ändern möchtest, kannst du ja das Pixmap vor dem speichern noch bearbeiten...

hth...

Antworten