2016-04-16 17 views
0

Hier ist ein Code, den ich nacheinander und wiederholt in mehrere Filekanäle schreibe.Wiederholt in mehrere Filechannels schreiben

Die Dateien werden gemacht, es gibt keine Fehler, aber nichts wird geschrieben. Der wichtige Teil ist, wo der Puffer geschrieben wird: "listofChan [j] .write (buff);" . Warum funktioniert das nicht?

FileChannel[] listofChan = new FileChannel[mStackHeight]; 
    FileOutputStream[] outputFiles = new FileOutputStream[mStackHeight]; 

    ByteBuffer buff = ByteBuffer.allocate(mStackWidth * 2); //2 byte integers 
    ShortBuffer SB = buff.asShortBuffer(); 

    ImageProcessor ip; 

    try { 
     for (int i = 0; i < mStackHeight; i++) { 
      outputFiles[i] = new FileOutputStream(new File(mSavepath + "\\T_" + i + ".dat"), true); 
      listofChan[i] = outputFiles[i].getChannel(); 
     } 
     System.out.println("File streams created successfully."); 

     for (int z = 0; z < mStackSz; z++) { //all slices in stack 
      ip = mStack.getProcessor(z + 1); 
      ip = ip.convertToShortProcessor(); 
      short[] Pixels = (short[]) ip.getPixels(); 
      for (int j = 0; j < mStackHeight; j++) { //all lines in one frame 
       SB.clear();      
       SB.put(Pixels, j * mStackWidth, mStackWidth); 
       listofChan[j].write(buff);      
      } 

      System.out.println("line " + z + " " + listofChan[mStackWidth-1].position()); 
      // System.out.println("Image line : " z-1+ p/mStackWidth); 
     } 

     for (int i = 0; i < mStackHeight; i++) { 
      outputFiles[i].close(); 
     } 

     System.out.println("Buffer contents written to file."); 

    } catch (IOException e) { 
     System.out.println("File IO exception : " + e.toString()); 

    } 

Okay, ich habe die Lösung gefunden:

I buff.clear() auf einer Linie hinzuzufügen, benötigen nur über SB.clear(); weil nach den ByteBuffer schreiben, die Lese-/Schreib-Postition am Ende des Puffers ist, es kann also nicht weiter geschrieben werden. Das gleiche für die IntBuffer, muss auch separat zurückgesetzt werden, da die Positionen beider Ansichten unabhängig sind (ich nehme an ...).

Antwort

1

Ich denke, Sie müssen Ihren Byte-Puffer umdrehen, bevor es geschrieben wird. Es ist immer noch im Lese/Put-Modus.

+0

Richtig, und 'compact()' nach dem 'write()'. – EJP

0

Sie sollten nicht zu einer solchen Low-Level-Programmierung gehen müssen, um Ihre Aufgabe zu erfüllen. In ImageJ sind bereits Werkzeuge verfügbar, um jeden Kanal in einer separaten Datei zu speichern.

Zum Beispiel können Sie dies tun, indem Sie Plugins> Bio-Formate> Bio-Formate Exporteur (dieses Plugin ist in Fiji enthalten), und es wird den folgenden Dialog vorstellen:

Bioformats dialog to allow saving separate files

Sie können die Recorder verwenden, um die erforderlichen Java-Code zu erhalten:

IJ.run(imp, "Bio-Formats Exporter", "save=C:\\Path\\To\\Your\\File.ome.tif write_each_channel compression=Uncompressed"); 

Wenn Sie rea Ich möchte mit dem Exporteur auf einer niedrigeren Ebene interagieren, werfen Sie einen Blick auf die source code of Exporter.java.

+0

Danke für die Info. Funktioniert das auch für extrem große Stapel (10000 Bilder und mehr)? –

+0

Ich habe es nicht versucht, aber es sollte. Ist dies nicht der Fall, handelt es sich um einen Fehler (und [sollte gemeldet werden] (http://imagej.net/Bug_reporting_best_practices)). Warum versuchst du es nicht einfach? –