Changeset 3760


Ignore:
Timestamp:
03/03/08 13:12:44 (12 years ago)
Author:
melissa
Message:

Added support for writing multi-series OME-TIFF files.

Location:
trunk/loci/formats
Files:
4 edited

Legend:

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

    r3747 r3760  
    214214    for (int i=0; i<tempIfdMap.size(); i++) { 
    215215      Vector v = (Vector) tempIfdMap.get(i); 
    216       for (int j=0; j<v.size(); j++) { 
     216      int ifdCount = ((Integer) tempIfdCount.get(i)).intValue(); 
     217      for (int j=0; j<ifdCount; j++) { 
    217218        ifdMap[i][j] = ((Integer) v.get(j)).intValue(); 
    218219      } 
    219       numIFDs[i] = v.size(); 
     220      numIFDs[i] = ifdCount; 
    220221    } 
    221222 
    222223    for (int i=0; i<tempFileMap.size(); i++) { 
    223224      Vector v = (Vector) tempFileMap.get(i); 
    224       for (int j=0; j<v.size(); j++) { 
     225      int ifdCount = ((Integer) tempIfdCount.get(i)).intValue(); 
     226      for (int j=0; j<ifdCount; j++) { 
    225227        fileMap[i][j] = ((Integer) v.get(j)).intValue(); 
    226228      } 
     
    551553 
    552554          for (int i=1; i<Integer.parseInt(numPlanes); i++) { 
    553             v.setElementAt(new Integer(Integer.parseInt(ifd) + i), idx + i); 
    554             y.setElementAt(new Integer(0), idx + i); 
     555            if (idx + i < v.size()) { 
     556              v.setElementAt(new Integer(Integer.parseInt(ifd) + i), idx + i); 
     557              y.setElementAt(new Integer(0), idx + i); 
     558            } 
     559            else { 
     560              int diff = idx + i - v.size(); 
     561              for (int q=0; q<diff; q++) { 
     562                v.add(new Integer(-1)); 
     563                y.add(new Integer(-1)); 
     564              } 
     565              v.add(new Integer(Integer.parseInt(ifd) + i)); 
     566              y.add(new Integer(0)); 
     567            } 
    555568          } 
    556569 
  • trunk/loci/formats/in/TCSReader.java

    r3751 r3760  
    118118    } 
    119119    catch (IOException e) { 
     120      if (debug) LogTools.trace(e); 
     121      return false; 
     122    } 
     123    catch (ArrayIndexOutOfBoundsException e) { 
    120124      if (debug) LogTools.trace(e); 
    121125      return false; 
  • trunk/loci/formats/out/OMETiffWriter.java

    r3572 r3760  
    2525package loci.formats.out; 
    2626 
     27import java.awt.Image; 
    2728import java.io.IOException; 
     29import java.util.Vector; 
    2830import loci.formats.*; 
    2931import loci.formats.meta.MetadataRetrieve; 
     
    3739 */ 
    3840public class OMETiffWriter extends TiffWriter { 
     41 
     42  // -- Fields -- 
     43 
     44  private Vector seriesMap; 
    3945 
    4046  // -- Constructor -- 
     
    5561      String xml = MetadataTools.getOMEXML(retrieve); 
    5662 
    57       // insert TiffData element 
    58       int pix = xml.indexOf("<Pixels "); 
    59       int end = xml.indexOf("</Pixels>", pix); 
    60       if (end != -1) { 
    61         xml = xml.substring(0, end) + "<TiffData/></Pixels>" + 
    62           xml.substring(end + 9); 
    63       } 
    64       else { 
    65         end = xml.indexOf("/>", pix); 
    66         xml = xml.substring(0, end) + "><TiffData/></Pixels>" + 
    67           xml.substring(end + 2); 
     63      int previousPixelsIndex = 0; 
     64 
     65      for (int series=0; series<retrieve.getImageCount(); series++) { 
     66        String dimensionOrder = retrieve.getPixelsDimensionOrder(series, 0); 
     67        int sizeZ = retrieve.getPixelsSizeZ(series, 0).intValue(); 
     68        int sizeC = retrieve.getPixelsSizeC(series, 0).intValue(); 
     69        int sizeT = retrieve.getPixelsSizeT(series, 0).intValue(); 
     70 
     71        int imageCount = 0; 
     72        for (int q=0; q<seriesMap.size(); q++) { 
     73          if ((((Integer) seriesMap.get(q))).intValue() == series) imageCount++; 
     74        } 
     75 
     76        StringBuffer tiffData = new StringBuffer(); 
     77        tiffData.append(">"); 
     78        int num = 0; 
     79        for (int q=0; q<imageCount; q++) { 
     80          while (((Integer) seriesMap.get(num)).intValue() != series) { 
     81            num++; 
     82          } 
     83          int[] coordinates = FormatTools.getZCTCoords(dimensionOrder, 
     84            sizeZ, sizeC, sizeT, imageCount, q); 
     85          tiffData.append("<TiffData IFD=\""); 
     86          tiffData.append(num); 
     87          tiffData.append("\" FirstZ=\""); 
     88          tiffData.append(coordinates[0]); 
     89          tiffData.append("\" FirstC=\""); 
     90          tiffData.append(coordinates[1]); 
     91          tiffData.append("\" FirstT=\""); 
     92          tiffData.append(coordinates[2]); 
     93          tiffData.append("\" />"); 
     94          num++; 
     95        } 
     96        tiffData.append("</Pixels>"); 
     97 
     98        // insert TiffData element 
     99        int pix = xml.indexOf("<Pixels ", previousPixelsIndex); 
     100        int end = xml.indexOf("</Pixels", pix); 
     101        int len = 9; 
     102        if (end == -1) { 
     103          end = xml.indexOf("/>", pix); 
     104          len = 2; 
     105        } 
     106 
     107        String prefix = xml.substring(0, end); 
     108        String suffix = xml.substring(end + len); 
     109        xml = prefix + tiffData.toString() + suffix; 
     110        previousPixelsIndex = pix + 8; 
    68111      } 
    69112 
     
    80123    } 
    81124    super.close(); 
     125    seriesMap = null; 
     126  } 
     127 
     128  // -- IFormatWriter API methods -- 
     129 
     130  public void saveImage(Image image, int series, boolean lastInSeries, 
     131    boolean last) throws FormatException, IOException 
     132  { 
     133    if (seriesMap == null) seriesMap = new Vector(); 
     134    seriesMap.add(new Integer(series)); 
     135    super.saveImage(image, series, lastInSeries, last); 
    82136  } 
    83137 
  • trunk/loci/formats/tools/ImageConverter.java

    r3580 r3760  
    5252    String in = null, out = null; 
    5353    boolean stitch = false, separate = false, merge = false, fill = false; 
    54     int series = 0; 
     54    int series = -1; 
    5555    if (args != null) { 
    5656      for (int i=0; i<args.length; i++) { 
     
    102102 
    103103    reader.setId(in); 
    104     reader.setSeries(series); 
    105104 
    106105    LogTools.print("[" + reader.getFormat() + "] -> " + out + " "); 
     
    115114    long mid = System.currentTimeMillis(); 
    116115 
    117     int num = writer.canDoStacks() ? reader.getImageCount() : 1; 
     116    int num = writer.canDoStacks() ? reader.getSeriesCount() : 1; 
    118117    long read = 0, write = 0; 
    119     for (int i=0; i<num; i++) { 
    120       long s = System.currentTimeMillis(); 
    121       Image image = reader.openImage(i); 
    122       long m = System.currentTimeMillis(); 
    123       writer.saveImage(image, i == num - 1); 
    124       long e = System.currentTimeMillis(); 
    125       LogTools.print("."); 
    126       read += m - s; 
    127       write += e - m; 
     118    int first = series == -1 ? 0 : series; 
     119    int last = series == -1 ? num : series + 1; 
     120    for (int q=first; q<last; q++) { 
     121      reader.setSeries(q); 
     122      int numImages = writer.canDoStacks() ? reader.getImageCount() : 1; 
     123      for (int i=0; i<numImages; i++) { 
     124        long s = System.currentTimeMillis(); 
     125        Image image = reader.openImage(i); 
     126        long m = System.currentTimeMillis(); 
     127        writer.saveImage(image, q, i == numImages - 1, 
     128          q == num - 1 && i == numImages - 1); 
     129        long e = System.currentTimeMillis(); 
     130        LogTools.print("."); 
     131        read += m - s; 
     132        write += e - m; 
     133      } 
    128134    } 
    129135    long end = System.currentTimeMillis(); 
Note: See TracChangeset for help on using the changeset viewer.