Hallo
zuerst ne kleine Vorstellung:
Ich bin ja nun neu hier und fange an ein wenig C zu lernen. Dafür habe ich mich natürlich gleich übernommen und ein altes Softwareprojekt übernommen - bzw. ein auf SDL und OpenGL basierendes Spiel: D2X.
Dort gibt es eine Option um Screenshots zu erzeugen. dies funktioniert alles relativ gut, solange ich Windows jedoch nu 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. Also wende ich mich mal an euch, da ein sehr guter Freund sehr gute Erfahrungen mit diesem Forum gemacht hat.
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...
Das Projekt läuft übrigens, wie ihr am ifdef sehen könnt plattformunabhängig. Unter Linux läuft es auch, und da scheint es relativ egal zu sein, in welcher Farbtiefe ich Screenshots mache.
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
zuerst ne kleine Vorstellung:
Ich bin ja nun neu hier und fange an ein wenig C zu lernen. Dafür habe ich mich natürlich gleich übernommen und ein altes Softwareprojekt übernommen - bzw. ein auf SDL und OpenGL basierendes Spiel: D2X.
Dort gibt es eine Option um Screenshots zu erzeugen. dies funktioniert alles relativ gut, solange ich Windows jedoch nu 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. Also wende ich mich mal an euch, da ein sehr guter Freund sehr gute Erfahrungen mit diesem Forum gemacht hat.
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...
Das Projekt läuft übrigens, wie ihr am ifdef sehen könnt plattformunabhängig. Unter Linux läuft es auch, und da scheint es relativ egal zu sein, in welcher Farbtiefe ich Screenshots mache.
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:
(anmerkung - erweiterung)