Changeset 7356


Ignore:
Timestamp:
12/08/10 14:00:54 (9 years ago)
Author:
melissa
Message:

Smarter pixel offset detection for Visitech XYS files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/VisitechReader.java

    r6881 r7356  
    5151  public static final String[] HTML_SUFFIX = {"html"}; 
    5252 
     53  public static final String HEADER_MARKER = "[USE SAME FILE]"; 
     54  public static final byte[] PIXELS_MARKER = new byte[] { 
     55    0, 0, 0, 0, 0, 0, (byte) 0xf0, 0x3f, 0, 0, 0, 0, 0, 0, (byte) 0xf0, 0x3f 
     56  }; 
     57 
    5358  // -- Fields -- 
    5459 
    5560  /** Files in this dataset. */ 
    5661  private Vector<String> files; 
     62 
     63  private long[] pixelOffsets; 
    5764 
    5865  // -- Constructor -- 
     
    104111    String file = files.get(fileIndex); 
    105112    RandomAccessInputStream s = new RandomAccessInputStream(file); 
    106     s.seek(374); 
    107     while (s.read() != (byte) 0xf0); 
    108     s.skipBytes(1); 
     113    s.order(isLittleEndian()); 
     114    s.seek(pixelOffsets[fileIndex]); 
    109115 
    110116    int paddingBytes = 
    111117      (int) (s.length() - s.getFilePointer() - div * plane) / (div - 1); 
    112  
    113     if (s.readInt() == 0) { 
    114       s.skipBytes(4 + ((plane + paddingBytes) * planeIndex)); 
    115     } 
    116     else { 
    117       if (planeIndex == 0) s.seek(s.getFilePointer() - 4); 
    118       else s.skipBytes((plane + paddingBytes) * planeIndex - 4); 
     118    if (planeIndex > 0) { 
     119      s.skipBytes((plane + paddingBytes) * planeIndex); 
    119120    } 
    120121 
     
    132133      int nFiles = getSizeC(); 
    133134      for (int i=0; i<nFiles; i++) { 
    134         v.add(files.get(getSeries() * nFiles + i)); 
     135        int index = getSeries() * nFiles + i; 
     136        if (index < files.size()) { 
     137          v.add(files.get(index)); 
     138        } 
    135139      } 
    136140    } 
     
    141145  public void close(boolean fileOnly) throws IOException { 
    142146    super.close(fileOnly); 
    143     if (!fileOnly) files = null; 
     147    if (!fileOnly) { 
     148      files = null; 
     149      pixelOffsets = null; 
     150    } 
    144151  } 
    145152 
     
    304311    } 
    305312 
     313    pixelOffsets = new long[files.size() - 1]; 
     314    for (int i=0; i<pixelOffsets.length; i++) { 
     315      pixelOffsets[i] = findPixelsOffset(i); 
     316    } 
    306317 
    307318    MetadataStore store = makeFilterMetadata(); 
     
    313324  } 
    314325 
     326  // -- Helper methods -- 
     327 
     328  private long findPixelsOffset(int fileIndex) throws IOException { 
     329    String file = files.get(fileIndex); 
     330    RandomAccessInputStream s = new RandomAccessInputStream(file); 
     331    s.order(isLittleEndian()); 
     332    s.findString(false, HEADER_MARKER); 
     333 
     334    int plane = FormatTools.getPlaneSize(this); 
     335    int planeCount = getSizeZ() * getSizeT(); 
     336 
     337    long skip = 
     338      (s.length() - s.getFilePointer() - (planeCount * plane)) / planeCount; 
     339    long fp = s.getFilePointer() + skip - HEADER_MARKER.length(); 
     340    s.seek(fp); 
     341    if (s.readByte() == PIXELS_MARKER[PIXELS_MARKER.length - 1]) { 
     342      fp++; 
     343    } 
     344    s.close(); 
     345    return fp; 
     346  } 
     347 
    315348} 
Note: See TracChangeset for help on using the changeset viewer.