Changeset 3133 for trunk


Ignore:
Timestamp:
09/05/07 13:09:39 (12 years ago)
Author:
melissa
Message:

Preliminary support for tiled ZVI images - still need to remove overlapping pixels.

File:
1 edited

Legend:

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

    r3131 r3133  
    103103  private int zIndex = -1, cIndex = -1, tIndex = -1; 
    104104 
     105  private boolean isTiled; 
     106  private int tileRows, tileColumns; 
     107 
    105108  // -- Constructor -- 
    106109 
     
    149152 
    150153    try { 
    151       Integer ii = new Integer(no); 
    152       Object directory = pixels.get(ii); 
    153       String name = (String) names.get(ii); 
    154  
    155       r.setVar("dir", directory); 
    156       r.setVar("entryName", name); 
    157       r.exec("document = dir.getEntry(entryName)"); 
    158       r.exec("dis = new DocumentInputStream(document)"); 
    159       r.exec("numBytes = dis.available()"); 
    160       r.setVar("skipBytes", ((Integer) offsets.get(ii)).longValue()); 
    161       r.exec("blah = dis.skip(skipBytes)"); 
    162       r.setVar("data", buf); 
    163       r.exec("dis.read(data)"); 
     154      int tiles = tileRows * tileColumns; 
     155      if (tiles == 0) { 
     156        tiles = 1;  
     157        tileRows = 1; 
     158        tileColumns = 1; 
     159      }  
     160      int start = no * tiles; 
     161      
     162      int bytes =  
     163        FormatTools.getBytesPerPixel(core.pixelType[0]) * getRGBChannelCount(); 
     164      int ex = core.sizeX[0] / tileColumns; 
     165      int ey = core.sizeY[0] / tileRows; 
     166      int row = ex * bytes; 
     167 
     168      int[] tileOrder = new int[tiles]; 
     169      if (tiles == 1) tileOrder[0] = 0; 
     170      else { 
     171        int p = 0; 
     172        for (int r=0; r<tileRows; r++) { 
     173          for (int c=0; c<tileColumns; c++) { 
     174            int n = (no % core.sizeC[0]) +  
     175              (tiles * core.sizeC[0] * (no / core.sizeC[0]));  
     176            if (r % 2 == 0) { 
     177              tileOrder[p] = p*core.sizeC[0] + n;  
     178            } 
     179            else { 
     180              tileOrder[p] = (tileColumns - c)*core.sizeC[0]; 
     181              if (p > 0 && c == 0) tileOrder[p] += tileOrder[p - 1]; 
     182              else if (c > 0) tileOrder[p] = tileOrder[p - 1] - core.sizeC[0];  
     183            } 
     184            p++;  
     185          } 
     186        } 
     187      } 
     188 
     189      for (int i=start; i<start+tiles; i++) { 
     190        Integer ii = new Integer(tileOrder[i - start]); 
     191        Object directory = pixels.get(ii); 
     192        String name = (String) names.get(ii); 
     193 
     194        r.setVar("dir", directory); 
     195        r.setVar("entryName", name); 
     196        r.exec("document = dir.getEntry(entryName)"); 
     197        r.exec("dis = new DocumentInputStream(document)"); 
     198        r.exec("numBytes = dis.available()"); 
     199        r.setVar("skipBytes", ((Integer) offsets.get(ii)).longValue()); 
     200        r.exec("blah = dis.skip(skipBytes)"); 
     201        r.setVar("data", buf); 
     202        
     203        int xf = ((i - start) % tileColumns) * ex * bytes;  
     204        int yf = ((i - start) / tileRows) * ey;  
     205        int offset = yf*core.sizeX[0]*bytes + xf; 
     206        for (int y=0; y<ey; y++) { 
     207          r.setVar("offset", offset); 
     208          r.setVar("len", row); 
     209          try { 
     210            r.exec("dis.read(data, offset, len)"); 
     211          } 
     212          catch (ReflectException e) { } 
     213          offset += core.sizeX[0]*bytes;  
     214        } 
     215      } 
    164216 
    165217      if (bpp > 6) bpp = 1; 
    166  
    167218      if (bpp == 3) { 
    168219        // reverse bytes in groups of 3 to account for BGR storage 
     
    173224        } 
    174225      } 
    175  
    176226      return buf; 
    177227    } 
    178228    catch (ReflectException e) { 
    179       needLegacy = true; 
    180       return openBytes(no, buf); 
     229      throw new FormatException(e);  
     230      //needLegacy = true; 
     231      //return openBytes(no, buf); 
    181232    } 
    182233  } 
     
    264315      if (core.sizeC[0] != cIndices.size()) core.sizeC[0] *= cIndices.size(); 
    265316 
    266       core.imageCount[0] = core.sizeZ[0] * core.sizeT[0] * getEffectiveSizeC(); 
     317      core.imageCount[0] = core.sizeZ[0] * core.sizeT[0] *  
     318        (core.rgb[0] ? 1 : core.sizeC[0]); 
     319 
     320      if (isTiled) { 
     321        int lowerLeft = Integer.parseInt((String) getMeta("ImageTile Index 0")); 
     322        int middle = Integer.parseInt((String) getMeta("ImageTile Index 1")); 
     323 
     324        tileColumns = lowerLeft - middle - 1; 
     325        tileRows = (lowerLeft / tileColumns) + 1; 
     326        core.sizeX[0] *= tileColumns; 
     327        core.sizeY[0] *= tileRows; 
     328      } 
    267329 
    268330      String s = (String) getMeta("Acquisition Bit Depth"); 
     
    806868      } 
    807869 
     870      if (key.indexOf("ImageTile") != -1) isTiled = true;  
    808871      addMeta(key, value); 
    809872    } 
Note: See TracChangeset for help on using the changeset viewer.