Auslesen einer mit JAva manipulierten .raw datei mit c++
-
Hi, mein Problemchen ist ein wenig länger, aber ich hoffe mir kann trotzdem jemand helfen :), registriere mich auch gleich
.
Mir hat jemand eine 2,6 gb grosse .raw datei geschickt, die mit Java manipuliert ist. Um Informationen über die RGB information über pos x,y zu erhalten, schrieb er mir folgende Anleitung:
- Grösse des Images ist 43200*21600
Da es sich um ein Riesenfile handelt, wollte ich das file in 1024x768 Schritten auslesen, soweit es geht.
- ich könne jede x,y position wie folgt ausleisen:int getColor(int x, int y)throws Exception{ RandomAccessFile raf = new RandomAccessFile("f:\\earth.raw", "r"); int offset = (x+y*43200)*3; raf.seek(offset); int r = is.read(); //hadde sich hier vertan? sollte wohl raf.read() werden int g = is.read(); int b = is.read(); int color = 0xff000000|(r<<16)|(g<<8)|b; return color; }
Leider hab ich keine IDE für JAVA und wollte es mit c++ machen, bin aber auf dem Gebiet streams nich so gut, ausserdem weiss ich nich wie man direkt Farbinformation in ein Bild speichert.
#define RAW "image.raw" int WIDTH 1024 int HEIGHT 768 /* ... includes ... */ int main() { int R,G,B; int color; int offset; //filename+nr zum saven char dest_file[80]; int file_nr = 0; //buffer char buffer[80]; int x = 0; int y = 0; ifstream fin(RAW); if(!fin){ return 0; } sprintf(dest_file, "image0.bmp"); ofstream fout(destfile, ofstream::app); while( true ) { for(y;y < HEIGHT;y++) { for(x;x < WIDTH ;x++) { offset = (x + y*43200)*3; fin.seekg(offset); /*da bin ich mir schon nich so sicher gibt auch n seekg mit 2 paramatern*/ //jetzt kommt mein Problem, in Java scheint //ein read() auszureichen um die Informationen //aus dem aktuellen Block zu lesen, in c++ //schnall ich die Paramter nich so ganz R = //fin.read(char* s, streamsize n ); ??? G = //fin.read(char* s, streamsize n ); B = //fin.read(char* s, streamsize n ); color = 0xff000000|(R<<16)|(G<<8)|B; //wie man mit write jedes Pixel in die bmp schreib, //schnall ich ebenfalls nicht //fout.write(??,??); } //end for 2 } //end for 1 //stream schliessen fout.close(); WIDTH += WIDTH; //Wenn Breite grösser .raw file if(WIDTH > 43200) { //ab zum nächsten Bild ... HEIGHT += HEIGHT; //... es sei denn, ende vom .raw erreicht, //dann unterbreche while if(HEIGHT > 21600+1000) // +1000 zur Sicherheit break; //wenn nächste "Bildreihe", dann setze WIDTH weider zurück WIDTH = 1024; //Datei Nr erhöhen file_nr++; //neue Datei zum schreiben öffnen sprintf(dest_file, "image%d.bmp", file_nr); fout.open(dest_file, ofstream::app); } //end if //Wenn die Breite noch nicht die Maximalbreite von .raw //erreicht hat lege neues file an else { //Datei Nr erhöhen file_nr++; //neue Datei zum schreiben öffnen sprintf(dest_file, "image%d.bmp", file_nr); fout.open(dest_file, ofstream::app); } //end else } // end while } //end main
Kann mir jemand helfen?
Danke
Ernie
-
ups hab nochwas vergessen, wenn WIDTH > 43200 ist, muss auf jeden Fall noch die Zählervariable x wieder auf 0 gesetzt werden.
-
Scheisse wenn man den coder vorher nicht in die IDE schreibt und testet
, hab nochwas vergessen. Wenn beide for loops beendet sind, muss counter x noch auf die aktuelle WIDTH gebracht werden.
/* ........................................ */ } //end for 2 } //end for 1 //stream schliessen fout.close(); x = WIDTH; WIDTH += WIDTH; /* ........................................ */
Ernie
-
ok hat sich erledigt, trotzdem danke