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.
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
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: