Changeset 5489


Ignore:
Timestamp:
09/21/09 13:27:52 (10 years ago)
Author:
melissa
Message:
  • Parse Mask ROIs from MIAS overlay TIFFs.
  • Fixed a bug in Base64 decompression.
Location:
trunk/components/bio-formats/src/loci/formats
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/codec/Base64Codec.java

    r5093 r5489  
    8080    int fewerThan24 = dataBits % 24; 
    8181    int numTriples = dataBits / 24; 
    82     byte[] encoded = null; 
    83     int encodedLength = 0; 
    84  
    85     if (fewerThan24 != 0) encodedLength = (numTriples + 1) * 4; 
    86     else encodedLength = numTriples * 4; 
    87  
    88     encoded = new byte[encodedLength]; 
     82    ByteVector encoded = new ByteVector(); 
    8983 
    9084    byte k, l, b1, b2, b3; 
    9185 
    92     int encodedIndex = 0; 
    9386    int dataIndex = 0; 
    9487 
     
    109102        (byte) ((b3) >> 6 ^ 0xfc); 
    110103 
    111       encoded[encodedIndex] = lookupBase64Alphabet[v1]; 
    112       encoded[encodedIndex + 1] = lookupBase64Alphabet[v2 | (k << 4)]; 
    113       encoded[encodedIndex + 2] = lookupBase64Alphabet[(l << 2) | v3]; 
    114       encoded[encodedIndex + 3] = lookupBase64Alphabet[b3 & 0x3f]; 
    115       encodedIndex += 4; 
     104      encoded.add(lookupBase64Alphabet[v1]); 
     105      encoded.add(lookupBase64Alphabet[v2 | (k << 4)]); 
     106      encoded.add(lookupBase64Alphabet[(l << 2) | v3]); 
     107      encoded.add(lookupBase64Alphabet[b3 & 0x3f]); 
    116108    } 
    117109 
     
    123115      byte v = ((b1 & -128) == 0) ? (byte) (b1 >> 2) : 
    124116        (byte) ((b1) >> 2 ^ 0xc0); 
    125       encoded[encodedIndex] = lookupBase64Alphabet[v]; 
    126       encoded[encodedIndex + 1] = lookupBase64Alphabet[k << 4]; 
    127       encoded[encodedIndex + 2] = (byte) '='; 
    128       encoded[encodedIndex + 3] = (byte) '='; 
     117      encoded.add(lookupBase64Alphabet[v]); 
     118      encoded.add(lookupBase64Alphabet[k << 4]); 
     119      encoded.add(PAD); 
     120      encoded.add(PAD); 
    129121    } 
    130122    else if (fewerThan24 == 16) { 
     
    139131        (byte) ((b2) >> 4 ^ 0xf0); 
    140132 
    141       encoded[encodedIndex] = lookupBase64Alphabet[v1]; 
    142       encoded[encodedIndex + 1] = lookupBase64Alphabet[v2 | (k << 4)]; 
    143       encoded[encodedIndex + 2] = lookupBase64Alphabet[l << 2]; 
    144       encoded[encodedIndex + 3] = (byte) '='; 
     133      encoded.add(lookupBase64Alphabet[v1]); 
     134      encoded.add(lookupBase64Alphabet[v2 | (k << 4)]); 
     135      encoded.add(lookupBase64Alphabet[l << 2]); 
     136      encoded.add(PAD); 
    145137    } 
    146138 
    147     return encoded; 
     139    return encoded.toByteArray(); 
    148140  } 
    149141 
     
    160152 
    161153    byte[] block = new byte[8192]; 
    162     in.read(block); 
     154    int nRead = in.read(block); 
    163155    int p = 0; 
    164156    byte b1 = base64Alphabet[block[p++]]; 
    165157    byte b2 = base64Alphabet[block[p++]]; 
    166158 
    167     while (b1 != -1 && b2 != -1) { 
     159    while (b1 != -1 && b2 != -1 && 
     160      (in.getFilePointer() - nRead + p < in.length())) 
     161    { 
    168162      marker0 = block[p++]; 
    169163      marker1 = block[p++]; 
    170164 
    171165      if (p == block.length) { 
    172         in.read(block); 
     166        nRead = in.read(block); 
    173167        p = 0; 
    174168      } 
    175169 
    176170      decodedData.add((byte) (b1 << 2 | b2 >> 4)); 
     171      if (p >= nRead && in.getFilePointer() >= in.length()) break; 
    177172      if (marker0 != PAD && marker1 != PAD) { 
    178173        b3 = base64Alphabet[marker0]; 
  • trunk/components/bio-formats/src/loci/formats/in/MIASReader.java

    r5476 r5489  
    3636import loci.common.RandomAccessInputStream; 
    3737import loci.common.Region; 
     38import loci.formats.ImageReader; 
    3839import loci.formats.CoreMetadata; 
    3940import loci.formats.FilePattern; 
     
    4142import loci.formats.FormatReader; 
    4243import loci.formats.FormatTools; 
     44import loci.formats.ImageTools; 
    4345import loci.formats.MetadataTools; 
     46import loci.formats.codec.Base64Codec; 
    4447import loci.formats.meta.FilterMetadata; 
    4548import loci.formats.meta.MetadataStore; 
     
    657660    // populate image-level ROIs 
    658661    String[] colors = new String[getSizeC()]; 
     662    int nextROI = 0; 
    659663    for (AnalysisFile af : analysisFiles) { 
    660664      String file = af.filename; 
     
    679683        for (int j=start+1; j<lines.length; j++) { 
    680684          populateROI(columnNames, lines[j].split("\t"), well, 
    681             j - start - 1, position[1], position[2], store); 
     685            nextROI++, position[1], position[2], store); 
    682686        } 
    683687      } 
     
    695699          store.setChannelComponentColorDomain( 
    696700            colors[position[3]], s, position[3], 0); 
     701        } 
     702        if (position[3] == 0) { 
     703          nextROI += parseMasks(store, well, nextROI, file); 
    697704        } 
    698705      } 
     
    890897  } 
    891898 
     899  /** 
     900   * Parse Mask ROIs from the given TIFF and place them in the given 
     901   * MetadataStore. 
     902   * @return the number of masks parsed 
     903   */ 
     904  private int parseMasks(MetadataStore store, int series, int roi, 
     905    String overlayTiff) throws FormatException, IOException 
     906  { 
     907    ImageReader r = new ImageReader(); 
     908    r.setId(overlayTiff); 
     909    byte[] plane = r.openBytes(0); 
     910    byte[][] planes = null; 
     911    if (r.isIndexed()) { 
     912      planes = ImageTools.indexedToRGB(r.get8BitLookupTable(), plane); 
     913    } 
     914    else { 
     915      planes = new byte[r.getRGBChannelCount()][]; 
     916      int bpp = FormatTools.getBytesPerPixel(r.getPixelType()); 
     917      for (int c=0; c<planes.length; c++) { 
     918        planes[c] = ImageTools.splitChannels( 
     919          plane, c, planes.length, bpp, false, r.isInterleaved()); 
     920      } 
     921    } 
     922 
     923    for (int i=0; i<planes[0].length; i++) { 
     924      boolean channelsEqual = true; 
     925      for (int c=1; c<planes.length; c++) { 
     926        if (planes[c][i] != planes[0][i]) { 
     927          channelsEqual = false; 
     928          break; 
     929        } 
     930      } 
     931      if (channelsEqual) { 
     932        for (int c=0; c<planes.length; c++) { 
     933          planes[c][i] = 0; 
     934        } 
     935      } 
     936    } 
     937 
     938    String pixelType = FormatTools.getPixelTypeString(r.getPixelType()); 
     939    Base64Codec compressor = new Base64Codec(); 
     940 
     941    int nMasks = 0; 
     942 
     943    for (int i=0; i<planes.length; i++) { 
     944      // threshold the pixel data 
     945 
     946      boolean validMask = false; 
     947      for (int p=0; p<planes[i].length; p++) { 
     948        if (planes[i][p] != 0) { 
     949          validMask = true; 
     950          planes[i][p] = (byte) 255; 
     951        } 
     952      } 
     953      if (validMask) { 
     954        store.setMaskX("0", series, roi + i, 0); 
     955        store.setMaskY("0", series, roi + i, 0); 
     956        store.setMaskWidth(String.valueOf(r.getSizeX()), series, roi + i, 0); 
     957        store.setMaskHeight(String.valueOf(r.getSizeY()), series, roi + i, 0); 
     958        store.setMaskPixelsBigEndian( 
     959          new Boolean(!r.isLittleEndian()), series, roi + i, 0); 
     960        store.setMaskPixelsSizeX(new Integer(r.getSizeX()), series, roi + i, 0); 
     961        store.setMaskPixelsSizeY(new Integer(r.getSizeY()), series, roi + i, 0); 
     962        store.setMaskPixelsExtendedPixelType(pixelType, series, roi + i, 0); 
     963 
     964        String mask = new String(compressor.compress(planes[i], null)); 
     965        store.setMaskPixelsBinData(mask, series, roi + i, 0); 
     966        nMasks++; 
     967      } 
     968    } 
     969    r.close(); 
     970    planes = null; 
     971    return nMasks; 
     972  } 
     973 
    892974  // -- Helper class -- 
    893975 
Note: See TracChangeset for help on using the changeset viewer.