Changeset 1785


Ignore:
Timestamp:
11/10/06 11:13:06 (13 years ago)
Author:
melissa
Message:

Added metadata support for ND2.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/ND2Reader.java

    r1781 r1785  
    2828import java.awt.image.BufferedImage; 
    2929import java.io.*; 
     30import java.util.StringTokenizer; 
    3031import loci.formats.*; 
    3132 
     
    277278    numImages = offsets.length; 
    278279 
    279     sizeC[0] = img.getRaster().getNumBands(); 
     280    // read XML metadata from the end of the file 
     281 
     282    RandomAccessStream ras = new RandomAccessStream(getMappedId(id)); 
     283    ras.seek(offsets[offsets.length - 1]); 
     284 
     285    boolean found = false; 
     286    int off = -1; 
     287    byte[] buf = new byte[2048]; 
     288    while (!found) { 
     289      int read = 0; 
     290      if (ras.getFilePointer() == offsets[offsets.length - 1]) { 
     291        read = ras.read(buf); 
     292      } 
     293      else { 
     294        System.arraycopy(buf, buf.length - 10, buf, 0, 10); 
     295        read = ras.read(buf, 10, buf.length - 10); 
     296      } 
     297 
     298      if (read == buf.length) read -= 10; 
     299      for (int i=0; i<read+9; i++) { 
     300        if (buf[i] == (byte) 0xff && buf[i+1] == (byte) 0xd9) { 
     301          found = true; 
     302          off = (int) (ras.getFilePointer() - (read+10) + i); 
     303          i = buf.length; 
     304          break; 
     305        } 
     306      } 
     307    } 
     308 
     309    if (off > 0 && off < ras.length() - 5) { 
     310      ras.seek(off + 5); 
     311      byte[] b = new byte[(int) (ras.length() - off)]; 
     312      ras.read(b); 
     313      String xml = new String(b); 
     314     
     315      // assume that this XML string will be malformed, since that's how both 
     316      // sample files are; this means we need to manually parse it :-( 
     317 
     318      // first, let's strip out all comments 
     319 
     320      while (xml.indexOf("<!--") != -1) { 
     321        int start = xml.indexOf("<!--"); 
     322        int end = xml.indexOf("-->", start); 
     323        String pre = xml.substring(0, start); 
     324        String post = xml.substring(end + 3); 
     325        xml = pre + post; 
     326      } 
     327 
     328      // strip out binary data at the end - this is irrelevant for our purposes 
     329      xml = xml.substring(0, xml.lastIndexOf("</MetadataSeq>") + 14); 
     330    
     331      // each chunk appears on a separate line, so split up the chunks 
     332 
     333      StringTokenizer st = new StringTokenizer(xml, "\r\n"); 
     334      while (st.hasMoreTokens()) { 
     335        String token = st.nextToken().trim(); 
     336        if (token.indexOf("<") != -1) { 
     337          String prefix = token.substring(1, token.indexOf(">")).trim(); 
     338          token = token.substring(token.indexOf(">") + 1); 
     339 
     340          while (token.indexOf("<") != -1) { 
     341            int start = token.indexOf("<"); 
     342            String s = token.substring(start + 1, token.indexOf(">", start)); 
     343            token = token.substring(token.indexOf(">", start)); 
     344 
     345            // get the prefix for this tag 
     346            if (s.indexOf(" ") != -1) { 
     347              String pre = s.substring(0, s.indexOf(" ")).trim(); 
     348              s = s.substring(s.indexOf(" ") + 1); 
     349 
     350              // get key/value pairs 
     351              while (s.indexOf("=") != -1) { 
     352                int eq = s.indexOf("="); 
     353                String key = s.substring(0, eq).trim(); 
     354                String value =  
     355                  s.substring(eq + 2, s.indexOf("\"", eq + 2)).trim(); 
     356                 
     357                // strip out the data types 
     358                if (key.indexOf("runtype") == -1) { 
     359                  metadata.put(prefix + " " + pre + " " + key, value); 
     360                } 
     361                s = s.substring(s.indexOf("\"", eq + 2) + 1); 
     362             } 
     363            } 
     364          } 
     365        } 
     366      } 
     367    } 
     368 
     369    // TODO : use sigBits to compute pixel type 
     370    String sigBits =  
     371      (String) metadata.get("AdvancedImageAttributes SignificantBits value"); 
     372    int bits = 0; 
     373    if (sigBits != null && sigBits.length() > 0) { 
     374      bits = Integer.parseInt(sigBits.trim()); 
     375    } 
     376 
     377    // determine the pixel size 
     378    String pixX = (String) metadata.get( 
     379      "CalibrationSeq _SEQUENCE_INDEX=\"0\" dCalibration value"); 
     380    String pixZ = (String) metadata.get( 
     381      "CalibrationSeq _SEQUENCE_INDEX=\"0\" dAspect value"); 
     382 
     383    float pixSizeX = 0f; 
     384    float pixSizeZ = 0f; 
     385 
     386    if (pixX != null && pixX.length() > 0) { 
     387      pixSizeX = Float.parseFloat(pixX.trim()); 
     388    } 
     389    if (pixZ != null && pixZ.length() > 0) { 
     390      pixSizeZ = Float.parseFloat(pixZ.trim()); 
     391    } 
     392 
     393    String channels =  
     394      (String) metadata.get("AdvancedImageAttributes VirtualComponents value"); 
     395    if (channels != null && channels.length() > 0) { 
     396      sizeC[0] = 3 - Integer.parseInt(channels.trim()); 
     397    } 
     398    else sizeC[0] = img.getRaster().getNumBands(); 
     399 
    280400    sizeT[0] = numImages; 
    281401    sizeZ[0] = 1; 
     
    295415      currentOrder[0], 
    296416      null); 
     417   
     418    store.setDimensions(new Float(pixSizeX), new Float(pixSizeX), 
     419      new Float(pixSizeZ), null, null, null); 
     420   
    297421  } 
    298422 
Note: See TracChangeset for help on using the changeset viewer.