Changeset 1991


Ignore:
Timestamp:
01/02/07 13:41:35 (13 years ago)
Author:
melissa
Message:

Sped up initialization and tweaked dimension detection logic to be more accurate.

File:
1 edited

Legend:

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

    r1988 r1991  
    2727import java.awt.image.*; 
    2828import java.io.*; 
    29 import java.util.StringTokenizer; 
     29import java.util.*; 
    3030import javax.imageio.*; 
    3131import loci.formats.*; 
     
    159159    in.read(b); 
    160160 
    161     BufferedImage img = ImageIO.read(new ByteArrayInputStream(b)); 
     161    ByteArrayInputStream bis = new ByteArrayInputStream(b); 
     162    BufferedImage img = ImageIO.read(bis); 
     163    bis.close(); 
     164    b = null; 
    162165 
    163166    int dataType = 0; 
     
    228231 
    229232    pixelType[0] = FormatReader.UINT8; 
    230  
    231     BufferedImage img = openImage(id, 0); 
    232     sizeX[0] = img.getWidth(); 
    233     sizeY[0] = img.getHeight(); 
    234     rgb = img.getRaster().getNumBands() > 1; 
    235  
    236     int numInvalid = 0; 
    237  
    238     for (int i=1; i<offsets.length; i++) { 
    239       if (offsets[i] - offsets[i - 1] < (sizeX[0] * sizeY[0] / 4)) { 
    240         offsets[i - 1] = 0; 
    241         numInvalid++; 
    242       } 
    243     } 
    244  
    245     long[] tempOffsets = new long[numImages - numInvalid]; 
    246     int pt = 0; 
    247     for (int i=0; i<offsets.length; i++) { 
    248       if (offsets[i] != 0) { 
    249         tempOffsets[pt] = offsets[i]; 
    250         pt++; 
    251       } 
    252     } 
    253     offsets = tempOffsets; 
    254     numImages = offsets.length; 
    255233 
    256234    // read XML metadata from the end of the file 
     
    293271      // first, let's strip out all comments 
    294272 
    295       while (xml.indexOf("<!--") != -1) { 
    296         int start = xml.indexOf("<!--"); 
    297         int end = xml.indexOf("-->", start); 
    298         String pre = xml.substring(0, start); 
    299         String post = xml.substring(end + 3); 
    300         xml = pre + post; 
    301       } 
     273      StringBuffer sb = new StringBuffer(xml); 
     274      while (sb.indexOf("<!--") != -1) { 
     275        int ndx = sb.indexOf("<!--"); 
     276        sb.delete(ndx, sb.indexOf("-->", ndx)); 
     277      } 
     278      xml = sb.toString(); 
    302279 
    303280      // strip out binary data at the end - this is irrelevant for our purposes 
     
    332309                // strip out the data types 
    333310                if (key.indexOf("runtype") == -1) { 
    334                   metadata.put(prefix + " " + pre + " " + key, value); 
     311                  String effectiveKey = prefix + " " + pre + " " + key; 
     312                  if (!metadata.containsKey(effectiveKey)) { 
     313                    metadata.put(effectiveKey, value); 
     314                  } 
     315                  else { 
     316                    String v = (String) metadata.get(effectiveKey); 
     317                    try { 
     318                      if (Integer.parseInt(v) < Integer.parseInt(value)) { 
     319                        metadata.put(effectiveKey, value); 
     320                      } 
     321                    } 
     322                    catch (Exception e) { } 
     323                  } 
    335324                } 
    336325                s = s.substring(s.indexOf("\"", eq + 2) + 1); 
    337              } 
     326              } 
    338327            } 
    339328          } 
     
    341330      } 
    342331    } 
     332 
     333    sizeX[0] = Integer.parseInt((String) metadata.get( 
     334      "MetadataSeq _SEQUENCE_INDEX=\"0\" right value")); 
     335    sizeY[0] = Integer.parseInt((String) metadata.get( 
     336      "MetadataSeq _SEQUENCE_INDEX=\"0\" bottom value")); 
     337 
     338    if (sizeX[0] == 0 || sizeY[0] == 0) { 
     339      String s = (String) metadata.get("ReportObjects " + 
     340       "_DOCTYPE=\"ReportObjectsDocument\" _VERSION=\"1.100000\" " + 
     341       "Container page_size"); 
     342      if (s != null) { 
     343        String x = s.substring(1, s.indexOf(",")); 
     344        sizeX[0] = (int) Float.parseFloat(x); 
     345        String y = s.substring(s.indexOf(",") + 1, s.indexOf(")")); 
     346        sizeY[0] = (int) Float.parseFloat(y); 
     347      } 
     348      else { 
     349        BufferedImage img = openImage(id, 0); 
     350        sizeX[0] = img.getWidth(); 
     351        sizeY[0] = img.getHeight(); 
     352      } 
     353    } 
     354 
     355    int numInvalid = 0; 
     356 
     357    for (int i=1; i<offsets.length; i++) { 
     358      if (offsets[i] - offsets[i - 1] < (sizeX[0] * sizeY[0] / 4)) { 
     359        offsets[i - 1] = 0; 
     360        numInvalid++; 
     361      } 
     362    } 
     363 
     364    long[] tempOffsets = new long[numImages - numInvalid]; 
     365    int pt = 0; 
     366    for (int i=0; i<offsets.length; i++) { 
     367      if (offsets[i] != 0) { 
     368        tempOffsets[pt] = offsets[i]; 
     369        pt++; 
     370      } 
     371    } 
     372    offsets = tempOffsets; 
     373    numImages = offsets.length; 
    343374 
    344375    String sigBits = 
     
    365396    } 
    366397 
    367     String channels = 
    368       (String) metadata.get("AdvancedImageAttributes VirtualComponents value"); 
    369     if (channels != null && channels.length() > 0) { 
    370       sizeC[0] = 3 - Integer.parseInt(channels.trim()); 
    371     } 
    372     else sizeC[0] = img.getRaster().getNumBands(); 
    373  
    374     sizeT[0] = numImages / (!rgb ? sizeC[0] : 1); 
    375     sizeZ[0] = 1; 
    376     orderCertain[0] = false; 
    377     currentOrder[0] = sizeC[0] > 1 ? "XYCTZ" : "XYTZC"; 
    378     pixelType[0] = ImageTools.getPixelType(img); 
    379  
    380     if (!rgb) { 
    381       while (sizeC[0] * sizeT[0] * sizeZ[0] < numImages) numImages--; 
     398    sizeC[0] = Integer.parseInt((String) metadata.get( 
     399      "MetadataSeq _SEQUENCE_INDEX=\"0\" uiCompCount value")); 
     400    if (sizeC[0] == 2) sizeC[0] = 1; 
     401 
     402    long[] timestamps = new long[numImages]; 
     403    long[] zstamps = new long[numImages]; 
     404 
     405    for (int i=0; i<numImages; i++) { 
     406      timestamps[i] = (long) Float.parseFloat((String) metadata.get( 
     407        "MetadataSeq _SEQUENCE_INDEX=\"" + i + "\" dTimeMSec value")); 
     408      zstamps[i] = (long) Float.parseFloat((String) metadata.get( 
     409        "MetadataSeq _SEQUENCE_INDEX=\"" + i + "\" dZPos value")); 
     410    } 
     411 
     412    Vector zs = new Vector(); 
     413    Vector ts = new Vector(); 
     414    for (int i=0; i<numImages; i++) { 
     415      if (!zs.contains(new Long(zstamps[i]))) { 
     416        sizeZ[0]++; 
     417        zs.add(new Long(zstamps[i])); 
     418      } 
     419      if (!ts.contains(new Long(timestamps[i]))) { 
     420        sizeT[0]++; 
     421        ts.add(new Long(timestamps[i])); 
     422      } 
     423    } 
     424    
     425    currentOrder[0] = "XY"; 
     426    long deltaT = timestamps[1] - timestamps[0]; 
     427    long deltaZ = zstamps[1] - zstamps[0]; 
     428 
     429    if (deltaT < deltaZ || deltaZ == 0) currentOrder[0] += "CTZ"; 
     430    else currentOrder[0] += "CZT"; 
     431 
     432    if (numImages < sizeZ[0] * sizeT[0]) { 
     433      if (sizeT[0] == numImages) { 
     434        sizeT[0] /= sizeZ[0] * getEffectiveSizeC(id); 
     435        while (numImages > sizeZ[0] * sizeT[0] * getEffectiveSizeC(id)) { 
     436          sizeT[0]++; 
     437        } 
     438      } 
     439      if (sizeZ[0] == numImages) { 
     440        sizeZ[0] /= sizeT[0] * getEffectiveSizeC(id); 
     441        while (numImages > sizeZ[0] * sizeT[0] * getEffectiveSizeC(id)) { 
     442          sizeZ[0]++; 
     443        } 
     444      } 
     445    } 
     446    
     447    if (numImages != sizeZ[0] * sizeT[0] * getEffectiveSizeC(id)) { 
     448      sizeZ[0] = numImages; 
     449      sizeT[0] = 1; 
     450      orderCertain[0] = false; 
    382451    } 
    383452 
     
    387456    } 
    388457    else validBits = null; 
     458 
     459    if (validBits == null) pixelType[0] = FormatReader.UINT8; 
     460    else { 
     461      int bpp = validBits[0]; 
     462      while (bpp % 8 != 0) bpp++; 
     463      switch (bpp) { 
     464        case 8: pixelType[0] = FormatReader.UINT8; break; 
     465        case 16: pixelType[0] = FormatReader.UINT16; break; 
     466        case 32: pixelType[0] = FormatReader.UINT32; break; 
     467        default:  
     468          throw new FormatException("Unsupported bits per pixel : " + bpp); 
     469      } 
     470 
     471    } 
     472 
     473    rgb = sizeC[0] == 3; 
    389474 
    390475    MetadataStore store = getMetadataStore(id); 
     
    392477      new Integer(sizeX[0]), 
    393478      new Integer(sizeY[0]), 
    394       new Integer(1), 
     479      new Integer(sizeZ[0]), 
    395480      new Integer(sizeC[0]), 
    396       new Integer(numImages), 
     481      new Integer(sizeT[0]), 
    397482      new Integer(pixelType[0]), 
    398483      new Boolean(isLittleEndian(id)), 
Note: See TracChangeset for help on using the changeset viewer.