Changeset 1418


Ignore:
Timestamp:
09/06/06 11:19:07 (14 years ago)
Author:
melissa
Message:

added multi-series support for Leica LEI; fixed issue with spaces in filenames

File:
1 edited

Legend:

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

    r1406 r1418  
    5454  protected TiffReader tiff; 
    5555 
    56   /** Number of channels in the file. */ 
    57   protected int numChannels; 
     56  /** Number of channels in the current series. */ 
     57  protected int[] numChannels; 
    5858 
    5959  /** Array of image file names. */ 
    60   protected String[] files; 
     60  protected Vector[] files; 
     61 
     62  /** Number of series in the file. */ 
     63  private int numSeries; 
     64 
     65  /** Image widths. */ 
     66  private int[] widths; 
     67 
     68  /** Image heights. */ 
     69  private int[] heights; 
     70 
     71  /** Number of Z slices. */ 
     72  private int[] zs; 
     73 
     74  /** Total number of planes in each series. */ 
     75  private int[] numPlanes; 
    6176 
    6277  // -- Constructor -- 
     
    104119      initFile(id); 
    105120    } 
    106     return (isRGB(id) && separated) ? 3*numImages : numImages; 
     121    return (isRGB(id) && separated) ? 3*numPlanes[series] : numPlanes[series]; 
     122  } 
     123 
     124  /** Return the number of series in the given Leica file. */ 
     125  public int getSeriesCount(String id) throws FormatException, IOException { 
     126    if (!id.equals(currentId) && !DataTools.samePrefix(id, currentId)) { 
     127      initFile(id); 
     128    } 
     129    return numSeries; 
    107130  } 
    108131 
     
    123146      initFile(id); 
    124147    } 
    125     return tiff.isRGB(files[0]); 
     148    return tiff.isRGB((String) files[series].get(0)); 
    126149  } 
    127150 
     
    131154      initFile(id); 
    132155    } 
    133     return ((Integer) metadata.get("Image width")).intValue(); 
     156    return widths[series]; 
    134157  } 
    135158 
     
    139162      initFile(id); 
    140163    } 
    141     return ((Integer) metadata.get("Image height")).intValue(); 
     164    return heights[series]; 
    142165  } 
    143166 
     
    147170      initFile(id); 
    148171    } 
    149     return ((Integer) metadata.get("Number of images")).intValue(); 
     172    return zs[series]; 
    150173  } 
    151174 
     
    155178      initFile(id); 
    156179    } 
    157     return numChannels; 
     180    return numChannels[series]; 
    158181  } 
    159182 
     
    191214    } 
    192215    if (isRGB(id) && separated) { 
    193       return tiff.openBytes(files[no / 3], no % 3); 
    194     } 
    195     return tiff.openBytes(files[no], 0); 
     216      return tiff.openBytes((String) files[series].get(no / 3), no % 3); 
     217    } 
     218    return tiff.openBytes((String) files[series].get(no), 0); 
    196219  } 
    197220 
     
    209232 
    210233    if (isRGB(id) && separated) { 
    211       return tiff.openImage(files[no / 3], no % 3); 
    212     } 
    213     return tiff.openImage(files[no], 0); 
     234      return tiff.openImage((String) files[series].get(no / 3), no % 3); 
     235    } 
     236    return tiff.openImage((String) files[series].get(no), 0); 
    214237  } 
    215238 
     
    234257 
    235258      in.seek(0); 
    236       numChannels = 0; 
    237259 
    238260      // open the TIFF file and look for the "Image Description" field 
     
    319341      Vector v = new Vector(); 
    320342      while (addr != 0) { 
     343        numSeries++; 
    321344        Hashtable ifd = new Hashtable(); 
    322345        v.add(ifd); 
    323  
    324346        in.seek(addr + 4); 
    325347 
     
    343365        addr = in.readInt(); 
    344366      } 
    345       headerIFDs = new Hashtable[v.size()]; 
     367 
     368      numChannels = new int[numSeries]; 
     369      widths = new int[numSeries]; 
     370      heights = new int[numSeries]; 
     371      zs = new int[numSeries]; 
     372      headerIFDs = new Hashtable[numSeries]; 
     373      files = new Vector[numSeries]; 
     374      numPlanes = new int[numSeries]; 
     375 
    346376      v.copyInto(headerIFDs); 
    347377 
     
    354384          nameLength = DataTools.bytesToInt(temp, 8, 4, littleEndian); 
    355385        } 
    356       } 
    357  
    358       Vector f = new Vector(); 
    359       for (int i=0; i<headerIFDs.length; i++) { 
     386         
     387        Vector f = new Vector(); 
    360388        byte[] tempData = (byte[]) headerIFDs[i].get(new Integer(15)); 
    361389        int tempImages = DataTools.bytesToInt(tempData, 0, 4, littleEndian); 
     390        String dirPrefix = new File(id).getParent(); 
     391        dirPrefix = dirPrefix == null ? "" : (dirPrefix + File.separator); 
    362392        for (int j=0; j<tempImages; j++) { 
    363393          // read in each filename 
    364           f.add(new String(tempData, 20 + 2*(j*nameLength), 2*nameLength)); 
     394          f.add(dirPrefix + DataTools.stripString( 
     395            new String(tempData, 20 + 2*(j*nameLength), 2*nameLength))); 
    365396        } 
    366       } 
    367  
    368       files = new String[f.size()]; 
    369       numImages = f.size(); 
    370       f.copyInto(files); 
    371  
    372       String dirPrefix = new File(id).getParent(); 
    373       dirPrefix = dirPrefix == null ? "" : (dirPrefix + File.separator); 
    374       for (int i=0; i<files.length; i++) { 
    375         files[i] = dirPrefix + DataTools.stripString(files[i]); 
    376       } 
     397 
     398        files[i] = f; 
     399        numPlanes[i] = f.size(); 
     400      } 
     401       
    377402      initMetadata(); 
    378403    } 
     
    471496        // the image data 
    472497        // ID_IMAGES 
    473         metadata.put("Number of images", new Integer( 
    474           DataTools.bytesToInt(temp, 0, 4, littleEndian))); 
    475         metadata.put("Image width", new Integer( 
    476           DataTools.bytesToInt(temp, 4, 4, littleEndian))); 
    477         metadata.put("Image height", new Integer( 
    478           DataTools.bytesToInt(temp, 8, 4, littleEndian))); 
     498         
     499        zs[i] = DataTools.bytesToInt(temp, 0, 4, littleEndian);  
     500        widths[i] = DataTools.bytesToInt(temp, 4, 4, littleEndian); 
     501        heights[i] = DataTools.bytesToInt(temp, 8, 4, littleEndian); 
     502         
     503        metadata.put("Number of images", new Integer(zs[i])); 
     504        metadata.put("Image width", new Integer(widths[i])); 
     505        metadata.put("Image height", new Integer(heights[i])); 
    479506        metadata.put("Bits per Sample", new Integer( 
    480507          DataTools.bytesToInt(temp, 12, 4, littleEndian))); 
     
    549576          } 
    550577 
    551           if (dimType.equals("channel")) numChannels++; 
     578          //if (dimType.equals("channel")) numChannels++; 
    552579          metadata.put("Dim" + j + " type", dimType); 
    553580          pt += 4; 
     
    696723        pt += 4; 
    697724 
     725        numChannels[i] = nChannels; 
     726 
    698727        for (int j=0; j<nChannels; j++) { 
    699728          metadata.put("LUT Channel " + j + " version", 
     
    720749          length = DataTools.bytesToInt(temp, pt, 4, littleEndian); 
    721750          pt += 4; 
    722           metadata.put("LUT Channel " + j + " name", 
    723             DataTools.stripString(new String(temp, pt, length))); 
     751 
     752          String name = DataTools.stripString(new String(temp, pt, length)); 
     753          if (name.equals("Green") || name.equals("Red") || name.equals("Blue")) 
     754          { 
     755            numChannels[i] = 3; 
     756          } 
     757          metadata.put("LUT Channel " + j + " name", name); 
    724758          pt += length; 
    725759 
     
    736770    catch (Exception e) { } 
    737771 
     772    /* 
    738773    if (numChannels == 0) numChannels++; 
    739774 
     
    742777    } 
    743778    catch (Exception exc) { } 
    744     Integer sizeX = (Integer) metadata.get("Image width"); 
    745     Integer sizeY = (Integer) metadata.get("Image height"); 
    746     Integer sizeZ = (Integer) metadata.get("Number of images"); 
    747     store.setPixels(sizeX, sizeY, sizeZ, 
    748       new Integer(numChannels == 0 ? 1 : numChannels), // SizeC 
    749       new Integer(1), // SizeT 
    750       null, // PixelType 
    751       new Boolean(!littleEndian), // BigEndian 
    752       "XYZTC", // DimensionOrder 
    753       null); // Use index 0 
    754  
    755     String timestamp = (String) metadata.get("Timestamp 1"); 
    756     String description = (String) metadata.get("Image Description"); 
    757  
    758     try { 
    759       store.setImage(null, timestamp.substring(3), description, null); 
    760     } 
    761     catch (NullPointerException n) { } 
     779    */ 
     780     
     781    for (int i=0; i<numSeries; i++) { 
     782      store.setPixels( 
     783        new Integer(widths[i]), 
     784        new Integer(heights[i]), 
     785        new Integer(zs[i]), 
     786        new Integer(numChannels[i] == 0 ? 1 : numChannels[i]), // SizeC 
     787        new Integer(1), // SizeT 
     788        null, // PixelType 
     789        new Boolean(!littleEndian), // BigEndian 
     790        "XYZTC", // DimensionOrder 
     791        new Integer(i)); 
     792 
     793      String timestamp = (String) metadata.get("Timestamp " + (i+1)); 
     794      String description = (String) metadata.get("Image Description"); 
     795 
     796      try { 
     797        store.setImage(null, timestamp.substring(3),  
     798          description, new Integer(i)); 
     799      } 
     800      catch (NullPointerException n) { } 
     801    } 
    762802 
    763803//  String voxel = metadata.get("VoxelType").toString(); 
Note: See TracChangeset for help on using the changeset viewer.