Changeset 7035


Ignore:
Timestamp:
10/05/10 11:35:45 (9 years ago)
Author:
hinerm
Message:

Bug Fixes: read image data from start to start + count, instead of start to count. Improvements: Reordered jData byte allocations to fix multichannel image handling. Added ChannelMerger wrap of reader to facilitate multichannel image reading.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/native/bf-itk/itkBioFormatsImageIO.cxx

    r7014 r7035  
    112112    try { 
    113113      itkDebugMacro("Creating Bio-Formats objects..."); 
    114       reader = new ChannelFiller; 
     114      reader = imageReader = new ImageReader; 
     115      reader = channelFiller = new ChannelFiller(*reader); 
     116      //reader = channelSeparator = new ChannelSeparator(reader); 
     117      channelSeparator = NULL; 
     118      reader = channelMerger = new ChannelMerger(*reader); 
    115119      writer = new ImageWriter; 
    116        //reader = new ChannelSeparator(reader); 
    117        //reader = new ChannelMerger(reader); 
    118120      itkDebugMacro("Created reader and writer."); 
    119121    } 
     
    130132 
    131133  BioFormatsImageIO::~BioFormatsImageIO() { 
    132     delete reader; 
    133     delete writer; 
     134    if (imageReader != NULL) delete imageReader; 
     135    imageReader = NULL; 
     136    if (channelFiller != NULL) delete channelFiller; 
     137    channelFiller = NULL; 
     138    if (channelSeparator != NULL) delete channelSeparator; 
     139    channelSeparator = NULL; 
     140    if (channelMerger != NULL) delete channelMerger; 
     141    channelMerger = NULL; 
     142    if (writer != NULL) delete writer; 
     143    writer = NULL; 
    134144  } // end destructor 
    135145 
     
    147157    try { 
    148158      // call Bio-Formats to check file type 
    149       isType = reader->isThisType(filename); 
     159      isType = ((IFormatHandler*) reader)->isThisType(filename); 
    150160      itkDebugMacro("isType = " << isType); 
    151161    } 
     
    367377      int imageCount = reader->getImageCount(); 
    368378 
     379      // allocate temporary array 
     380      bool canDoDirect = rgbChannelCount == 1; 
     381      jbyte* tmpData = NULL; 
     382      if (!canDoDirect) tmpData = new jbyte[bytesPerPlane]; 
     383 
    369384      jbyte* jData = (jbyte*) pData; 
    370385      ByteArray buf(bytesPerPlane); // pre-allocate buffer 
    371       for (int c=cStart; c<cCount; c++) { 
    372         for (int t=tStart; t<tCount; t++) { 
    373           for (int z=zStart; z<zCount; z++) { 
     386      for (int c=cStart; c<cStart+cCount; c++) { 
     387        for (int t=tStart; t<tStart+tCount; t++) { 
     388          for (int z=zStart; z<zStart+zCount; z++) { 
    374389            int no = reader->getIndex(z, c, t); 
    375390            itkDebugMacro("Reading image plane " << no 
     
    378393            reader->openBytes(no, buf, xStart, yStart, xCount, yCount); 
    379394 
    380             // copy raw byte array 
    381395            JNIEnv* env = jace::helper::attach(); 
    382396            jbyteArray jArray = static_cast<jbyteArray>(buf.getJavaJniArray()); 
    383             env->GetByteArrayRegion(jArray, 0, bytesPerPlane, jData); 
     397            if (canDoDirect) { 
     398              env->GetByteArrayRegion(jArray, 0, bytesPerPlane, jData); 
     399            } 
     400            else { 
     401              // need to reorganize byte array after copy 
     402              env->GetByteArrayRegion(jArray, 0, bytesPerPlane, tmpData); 
     403 
     404              // reorganize elements 
     405              int pos = 0; 
     406              for (int x=0; x<xCount; x++) { 
     407                for (int y=0; y<yCount; y++) { 
     408                  for (int i=0; i<rgbChannelCount; i++) { 
     409                    for (int b=0; b<bpp; b++) { 
     410                      int index = yCount * (xCount * (rgbChannelCount * b + i) + x) + y; 
     411                      jData[pos++] = tmpData[index]; 
     412                    } 
     413                  } 
     414                } 
     415              } 
     416            } 
    384417            jData += bytesPerPlane; 
    385418          } 
     
    387420      } 
    388421 
    389       reader->close(); 
     422      // delete temporary array 
     423      if (tmpData != NULL) { 
     424        delete tmpData; 
     425        tmpData = NULL; 
     426      } 
     427 
     428      ((IFormatHandler*)reader)->close(); 
    390429    } 
    391430    catch (Exception& e) { 
Note: See TracChangeset for help on using the changeset viewer.