Changeset 7552


Ignore:
Timestamp:
01/19/11 14:35:40 (9 years ago)
Author:
melissa
Message:

Group together separate blocks of pixels that belong to the same stack. See #627.

File:
1 edited

Legend:

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

    r7543 r7552  
    6464  private Vector<Double> ndFilters; 
    6565 
     66  private long[][] planeOffset; 
     67 
    6668  private boolean adjust = true; 
    6769  private boolean isSpool; 
     
    9496    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
    9597 
    96     int plane = FormatTools.getPlaneSize(this); 
    97     long offset = pixelOffsets.get(series).longValue() + plane * no; 
     98    long offset = planeOffset[getSeries()][no]; 
    9899    in.seek(offset); 
    99100 
     
    131132      metadataInPlanes = null; 
    132133      adjust = true; 
     134      planeOffset = null; 
    133135    } 
    134136  } 
     
    338340    } 
    339341 
     342    Vector<Long> orderedSeries = new Vector<Long>(); 
     343    Hashtable<Long, Vector<Integer>> uniqueSeries = 
     344      new Hashtable<Long, Vector<Integer>>(); 
     345 
    340346    for (int i=0; i<pixelOffsets.size(); i++) { 
    341347      long length = pixelLengths.get(i).longValue(); 
     
    349355        i--; 
    350356      } 
     357      else { 
     358        Vector<Integer> v = uniqueSeries.get(length); 
     359        if (v == null) { 
     360          orderedSeries.add(length); 
     361          v = new Vector<Integer>(); 
     362        } 
     363 
     364        v.add(i); 
     365        uniqueSeries.put(length, v); 
     366      } 
    351367    } 
    352368 
    353369    if (pixelOffsets.size() > 1) { 
    354370      boolean little = isLittleEndian(); 
    355       core = new CoreMetadata[pixelOffsets.size()]; 
     371      core = new CoreMetadata[uniqueSeries.size()]; 
    356372      for (int i=0; i<getSeriesCount(); i++) { 
    357373        core[i] = new CoreMetadata(); 
     
    376392    Vector<String> channelNames = new Vector<String>(); 
    377393    int nextName = 0; 
     394 
     395    int[] sizeX = new int[pixelOffsets.size()]; 
     396    int[] sizeY = new int[pixelOffsets.size()]; 
     397    int[] sizeZ = new int[pixelOffsets.size()]; 
     398    int[] sizeC = new int[pixelOffsets.size()]; 
    378399 
    379400    // try to find the width and height 
     
    414435              pixelOffsets.get(j + 1).longValue(); 
    415436            if (in.getFilePointer() < end) { 
    416               if (core[j].sizeX == 0) { 
    417                 core[j].sizeX = in.readShort(); 
    418                 core[j].sizeY = in.readShort(); 
     437              if (sizeX[j] == 0) { 
     438                sizeX[j] = in.readShort(); 
     439                sizeY[j] = in.readShort(); 
    419440                int checkX = in.readShort(); 
    420441                int checkY = in.readShort(); 
    421442                int div = in.readShort(); 
    422                 core[j].sizeX /= (div == 0 ? 1 : div); 
     443                sizeX[j] /= (div == 0 ? 1 : div); 
    423444                div = in.readShort(); 
    424                 core[j].sizeY /= (div == 0 ? 1 : div); 
     445                sizeY[j] /= (div == 0 ? 1 : div); 
    425446              } 
    426447              if (prevSeries != j) { 
     
    428449              } 
    429450              prevSeries = j; 
    430               core[j].sizeC = iCount; 
     451              sizeC[j] = iCount; 
    431452              break; 
    432453            } 
     
    435456        else if (n == 'u') { 
    436457          uCount++; 
    437           for (int j=0; j<pixelOffsets.size(); j++) { 
    438             long end = j == pixelOffsets.size() - 1 ? in.length() : 
     458          for (int j=0; j<getSeriesCount(); j++) { 
     459            long end = j == getSeriesCount() - 1 ? in.length() : 
    439460              pixelOffsets.get(j + 1).longValue(); 
    440461            if (in.getFilePointer() < end) { 
     
    443464              } 
    444465              prevSeriesU = j; 
    445               core[j].sizeZ = uCount; 
     466              sizeZ[j] = uCount; 
    446467              break; 
    447468            } 
     
    474495            div = in.readShort(); 
    475496            y /= (div == 0 ? 1 : div); 
    476             if (x > 16 && (x < core[nextName - 1].sizeX || 
    477               core[nextName - 1].sizeX == 0) && y > 16 && 
    478               (y < core[nextName - 1].sizeY || core[nextName - 1].sizeY == 0)) 
     497            if (x > 16 && (x < sizeX[nextName - 1] || 
     498              sizeX[nextName - 1] == 0) && y > 16 && 
     499              (y < sizeY[nextName - 1] || sizeY[nextName - 1] == 0)) 
    479500            { 
    480               core[nextName - 1].sizeX = x; 
    481               core[nextName - 1].sizeY = y; 
     501              sizeX[nextName - 1] = x; 
     502              sizeY[nextName - 1] = y; 
    482503              adjust = false; 
    483504            } 
     
    527548            if (in.getFilePointer() < end) { 
    528549              in.skipBytes(16); 
    529               core[j].sizeX = in.readShort(); 
    530               core[j].sizeY = in.readShort(); 
     550              sizeX[j] = in.readShort(); 
     551              sizeY[j] = in.readShort(); 
    531552              adjust = false; 
    532553              break; 
     
    537558    } 
    538559 
     560    planeOffset = new long[getSeriesCount()][]; 
     561 
    539562    for (int i=0; i<getSeriesCount(); i++) { 
    540563      setSeries(i); 
    541       long pixels = pixelLengths.get(i).longValue() / 2; 
     564 
     565      Vector<Integer> pixelIndexes = uniqueSeries.get(orderedSeries.get(i)); 
     566      int index = pixelIndexes.get(0); 
     567 
     568      long pixels = pixelLengths.get(index).longValue() / 2; 
    542569      boolean x = true; 
     570 
     571      core[i].sizeX = sizeX[index]; 
     572      core[i].sizeY = sizeY[index]; 
     573      core[i].sizeC = sizeC[index]; 
     574      core[i].sizeZ = sizeZ[index]; 
    543575 
    544576      if (getSizeC() == 0) core[i].sizeC = 1; 
     
    573605      } 
    574606      if (getSizeT() == 0) core[i].sizeT = 1; 
     607 
     608      int nBlocks = uniqueSeries.get(orderedSeries.get(i)).size(); 
     609      core[i].sizeT *= nBlocks; 
    575610      core[i].imageCount = nPlanes * getSizeT(); 
    576611      core[i].pixelType = FormatTools.UINT16; 
    577       core[i].dimensionOrder = "XYZTC"; 
     612      core[i].dimensionOrder = nBlocks > 1 ? "XYZCT" : "XYZTC"; 
    578613      core[i].indexed = false; 
    579614      core[i].falseColor = false; 
    580615      core[i].metadataComplete = true; 
     616 
     617      planeOffset[i] = new long[getImageCount()]; 
     618      int nextImage = 0; 
     619      for (Integer pixelIndex : pixelIndexes) { 
     620        long offset = pixelOffsets.get(pixelIndex); 
     621        long length = pixelLengths.get(pixelIndex); 
     622        int planeSize = getSizeX() * getSizeY() * 2; 
     623        int planes = (int) (length / planeSize); 
     624        for (int p=0; p<planes; p++, nextImage++) { 
     625          planeOffset[i][nextImage] = offset + p * planeSize; 
     626        } 
     627      } 
    581628    } 
    582629    setSeries(0); 
Note: See TracChangeset for help on using the changeset viewer.