Changeset 4001


Ignore:
Timestamp:
05/05/08 14:12:34 (12 years ago)
Author:
melissa
Message:

Speed improvements to channel splitting.

Location:
trunk/loci/formats
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/ChannelSeparator.java

    r3655 r4001  
    146146      } 
    147147 
    148       byte[] n = ImageTools.splitChannels(lastImage, c, 
    149         FormatTools.getBytesPerPixel(getPixelType()), false, 
    150         !isInterleaved())[channel]; 
     148      byte[] n = ImageTools.splitChannels(lastImage, channel, c, 
     149        FormatTools.getBytesPerPixel(getPixelType()), false, !isInterleaved()); 
    151150      System.arraycopy(n, 0, buf, 0, n.length); 
    152151      return buf; 
  • trunk/loci/formats/ImageTools.java

    r3819 r4001  
    932932   * channels are in BGR order. 
    933933   */ 
    934   public static byte[][] splitChannels(byte[] array, int c, int bytes, 
     934  public static byte[] splitChannels(byte[] array, int index, int c, int bytes, 
    935935    boolean reverse, boolean interleaved) 
    936936  { 
    937     byte[][] rtn = new byte[c][array.length / c]; 
     937    byte[] rtn = new byte[array.length / c]; 
     938 
     939    if (reverse) index = c - index - 1; 
    938940 
    939941    if (interleaved) { 
    940       if (reverse) { 
    941         int offset = 0; 
    942         for (int i=c-1; i>=0; i--) { 
    943           System.arraycopy(array, offset, rtn[i], 0, rtn[i].length); 
    944           offset += rtn[c].length; 
    945         } 
    946       } 
    947       else { 
    948         for (int i=0; i<c; i++) { 
    949           System.arraycopy(array, i * rtn[i].length, rtn[i], 0, rtn[i].length); 
    950         } 
    951       } 
     942      System.arraycopy(array, rtn.length * index, rtn, 0, rtn.length); 
    952943    } 
    953944    else { 
    954       if (reverse) { 
    955         int next = 0; 
    956         for (int i=0; i<array.length; i+=c*bytes) { 
    957           for (int j=c-1; j>=0; j--) { 
    958             for (int k=0; k<bytes; k++) { 
    959               if (next < rtn[j].length) { 
    960                 rtn[c - j - 1][next] = array[i + j*bytes + k]; 
    961               } 
    962               next++; 
    963             } 
    964             next -= bytes; 
    965           } 
    966           next += bytes; 
    967         } 
    968       } 
    969       else { 
    970         int next = 0; 
    971         for (int i=0; i<array.length; i+=c*bytes) { 
    972           for (int j=0; j<c; j++) { 
    973             for (int k=0; k<bytes; k++) { 
    974               if (next < rtn[j].length) rtn[j][next] = array[i + j*bytes + k]; 
    975               next++; 
    976             } 
    977             next -= bytes; 
    978           } 
    979           next += bytes; 
     945      int next = 0; 
     946      for (int i=0; i<array.length; i+=c*bytes) { 
     947        for (int k=0; k<bytes; k++) { 
     948          if (next < rtn.length) rtn[next] = array[i + index*bytes + k]; 
     949          next++; 
    980950        } 
    981951      } 
  • trunk/loci/formats/ome/OMEWriter.java

    r3969 r4001  
    246246    try { 
    247247      int planeLength = x * y * bpp; 
    248       byte[][] b = ImageTools.splitChannels(bytes, bytes.length / planeLength, 
    249         bpp, false, true); 
    250  
    251       for (int ch=0; ch<b.length; ch++) { 
     248      int nChannels = bytes.length / planeLength; 
     249 
     250      for (int ch=0; ch<nChannels; ch++) { 
    252251        int[] coords = FormatTools.getZCTCoords(order, z, c, t, z*c*t, 
    253252          planesWritten); 
     253 
     254        byte[] b = 
     255          ImageTools.splitChannels(bytes, ch, nChannels, bpp, false, true); 
    254256 
    255257        r.setVar("zndx", coords[0]); 
    256258        r.setVar("cndx", coords[1]); 
    257259        r.setVar("tndx", coords[2]); 
    258         r.setVar("bytes", b[ch]); 
     260        r.setVar("bytes", b); 
    259261        r.setVar("bigEndian", bigEndian); 
    260262 
Note: See TracChangeset for help on using the changeset viewer.