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 ➡


Anmelden zum Antworten