[C] TGA-Screenshots aus OPenGL Anwendung - verzerrt

Z

Zico

Lebende Foren Legende
Hallo

Ich arbeite ja derzeit ein wenig an dem DXX-Rebirth Projekt (www.dxx-rebirth.de).

Dort gibt es eine Option um Screenshots zu erzeugen. dies funktioniert alles relativ gut, solange ich es auf 16Bit Farbtiefe betreibe. Auf 32Bit werden die Bilder jedoch total verzerrt dargestellt.

Den Fehler vermute ich irgendwo im TGA-Header. Doch da bin ich sehr überfordert.

Natürlich wäre es zu viel verlangt euch den gesamten Quellcode aufzudrücken. Daher geb ich euch mal die entsprechende Funktion, die das TGA dann kalkuliert und schreibt. Ich hoffe, dass dort der Fehler irgendwo versteckt ist.

Code:
void write_bmp(char *savename,int w,int h,unsigned char *buf){
	int f;
#ifdef _WIN32
	f=open(savename,O_CREAT|O_EXCL|O_WRONLY,S_IREAD|S_IWRITE);
#else
	f=open(savename,O_CREAT|O_EXCL|O_WRONLY,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
#endif
	if (f>=0){
		GLubyte    targaMagic[12] = { 0, //no identification field
			 0,//no colormap
			 2,//RGB image (well, BGR, actually)
			 0, 0, 0, 0, 0, 0, 0, 0, 0 };//no colormap or image origin stuff.
		GLubyte blah;
		int r;
		GLubyte *s;
 		int x,y;
		
		//write .TGA header.
		write (f,targaMagic,sizeof(targaMagic));
		blah=w%256;write (f,&blah,1);//w, low
		blah=w/256;write (f,&blah,1);//w, high
		blah=h%256;write (f,&blah,1);//h, low
		blah=h/256;write (f,&blah,1);//h, high
		blah=24;write (f,&blah,1);//24 bpp
		blah=0;write (f,&blah,1);//no attribute bits, origin is lowerleft, no interleave
		
		s=buf;
		for (y=0;y<h;y++){//TGAs use BGR ordering of data.
			for (x=0;x<w;x++){
				blah=s[0];
				s[0]=s[2];
				s[2]=blah;
				s+=3;				
			}
		}
		x=0;y=w*h*3;
		while (y > 0)
		{
			r=write(f,buf+x,y);
			if (r<=0){
				mprintf((0,"screenshot error, couldn't write to %s (err %i)\n",savename,errno));
				break;
			}
			x+=r;y-=r;
		}
		close(f);
	}else{
		mprintf((0,"screenshot error, couldn't open %s (err %i)\n",savename,errno));
	}
}

Wie ihr seht, ist das nicht der allerbeste Code...

Ich hoffe, dass jemand eine Idee hat. Falls jemand doch mehr Code sehen möchte, kann ich diesen gerne komplet zur Verfügung stellen (natürlich nicht in einem Post ;) )

EDIT: hier ein Beispielbild: http://mitglied.lycos.de/zicoc/dxx/scrn0000.tga

Vielen Dank im Vorraus
Christian
 
Zuletzt bearbeitet:

Ähnliche Themen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Rollei Mini Wifi Camcorder

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Aufgabe in C

NagiosGrapher 1.7.1 funktioniert nicht

Zurück
Oben