Changeset 3107 for trunk


Ignore:
Timestamp:
08/27/07 15:11:08 (12 years ago)
Author:
melissa
Message:

Added support for zlib-compressed pixel data.

File:
1 edited

Legend:

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

    r3096 r3107  
    2828import java.io.*; 
    2929import java.util.*; 
     30import java.util.zip.*; 
    3031import javax.imageio.spi.IIORegistry; 
    3132import javax.imageio.spi.ServiceRegistry; 
     
    137138  private boolean isJPEG; 
    138139 
     140  /** Whether or not the pixel data is losslessly compressed. */ 
     141  private boolean isLossless; 
     142 
     143  private boolean adjustImageCount; 
     144 
    139145  private Vector zs = new Vector(); 
    140146  private Vector ts = new Vector(); 
     
    174180      throw new FormatException("Buffer too small."); 
    175181    } 
    176  
     182   
    177183    in.seek(offsets[no]); 
    178184 
     
    186192      pixels = null; 
    187193    } 
    188     else { 
    189       in.readFully(buf); 
    190     } 
    191  
     194    else if (isLossless) { 
     195      byte[] b = new byte[buf.length]; 
     196      in.read(b); 
     197      Inflater decompresser = new Inflater(); 
     198      decompresser.setInput(b); 
     199      try { decompresser.inflate(buf); } 
     200      catch (DataFormatException e) { throw new FormatException(e); } 
     201      decompresser.end(); 
     202    } 
     203    else in.readFully(buf); 
    192204    return buf; 
    193205  } 
     
    345357      } 
    346358 
     359      if (isLossless) { 
     360        for (int i=0; i<offsets.length; i++) { 
     361          offsets[i] += i + 1; 
     362        } 
     363      } 
     364 
    347365      if (core.sizeC[0] == 0) core.sizeC[0] = 1; 
    348366      core.currentOrder[0] = "XYCZT"; 
    349367      core.rgb[0] = core.sizeC[0] > 1; 
    350       core.littleEndian[0] = false; 
     368      if (core.sizeC[0] > 1 && adjustImageCount) { 
     369        core.imageCount[0] /= 3; 
     370        core.sizeZ[0] /= 3; 
     371      } 
     372      core.littleEndian[0] = isLossless; 
    351373      core.interleaved[0] = false; 
    352374 
     
    737759        } 
    738760      } 
     761      else if (qName.equals("bValid")) { 
     762        adjustImageCount = attributes.getValue("value").equals("true"); 
     763      } 
     764      else if (qName.equals("uiComp")) { 
     765        core.sizeC[0] = Integer.parseInt(attributes.getValue("value")); 
     766      } 
    739767      else if (qName.equals("uiBpcInMemory")) { 
    740768        if (attributes.getValue("value") == null) return; 
    741         int bits = Integer.parseInt(attributes.getValue("value")); 
     769          int bits = Integer.parseInt(attributes.getValue("value")); 
    742770        int bytes = bits / 8; 
    743771        switch (bytes) { 
     
    766794        core.sizeT[0] = 1; 
    767795      } 
     796      else if (qName.equals("dCompressionParam")) { 
     797        isLossless = attributes.getValue("value").equals("1"); 
     798        addMeta(qName, attributes.getValue("value")); 
     799      } 
    768800      else { 
    769801        addMeta(qName, attributes.getValue("value")); 
Note: See TracChangeset for help on using the changeset viewer.