Changeset 2067


Ignore:
Timestamp:
01/10/07 16:23:03 (13 years ago)
Author:
melissa
Message:

Finally fixed bug in RGB conversion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/plugins/Importer.java

    r2059 r2067  
    7575  private Checkbox rangeBox; 
    7676  private Choice stackChoice; 
     77  private boolean mergeChannels; 
    7778 
    7879  // -- Constructor -- 
     
    183184 
    184185    // load preferences from IJ_Prefs.txt 
    185     boolean mergeChannels = Prefs.get("bioformats.mergeChannels", false); 
     186    mergeChannels = Prefs.get("bioformats.mergeChannels", false); 
    186187    boolean ignoreTables = Prefs.get("bioformats.ignoreTable", false); 
    187188    boolean colorize = Prefs.get("bioformats.colorize", false); 
     
    274275        id = gd.getNextString(); 
    275276      } 
    276       if(fs != null) { 
    277         if (mergeChannels) r = new ChannelMerger(fs); 
     277      if (fs != null) { 
     278        if (mergeChannels) { 
     279          if (r.getPixelType(id) == FormatReader.FLOAT) { 
     280            r = new ChannelMerger(fs); 
     281          } 
     282          else r = new ChannelSeparator(fs); 
     283        } 
    278284        else r = new ChannelSeparator(fs); 
    279285      } 
    280286      else { 
    281         if (mergeChannels) r = new ChannelMerger(r); 
     287        if (mergeChannels) { 
     288          if (r.getPixelType(id) == FormatReader.FLOAT) { 
     289            r = new ChannelMerger(r); 
     290          } 
     291          else r = new ChannelSeparator(r); 
     292        } 
    282293        else r = new ChannelSeparator(r); 
    283294      } 
    284  
    285295      r.setColorTableIgnored(ignoreTables); 
    286296 
     
    584594              } 
    585595               
    586               for (int ch=0; ch<c; ch++) { 
    587                 byte[] nb = new byte[w * h]; 
    588                 if (c == 1) nb = bytes; 
    589                 else System.arraycopy(bytes, ch*w*h, nb, 0, nb.length); 
    590                 ip = new ByteProcessor(w, h, nb, null); 
    591                 if (stackB == null) stackB = new ImageStack(w, h); 
    592                 stackB.addSlice(imageName + ":" + (j + 1), ip); 
    593               } 
    594                
    595               /* 
    596               if (c == 1) { 
    597                 ip = new ByteProcessor(w, h, bytes, null); 
    598                 if (stackB == null) stackB = new ImageStack(w, h); 
    599                 stackB.addSlice(imageName + ":" + (j + 1), ip); 
    600               } 
    601               else { 
    602                 if (stackO == null) stackO = new ImageStack(w, h); 
    603                 ip = new ColorProcessor(w, h); 
    604                 byte[][] pix = new byte[c][w*h]; 
    605                 for (int k=0; k<c; k++) { 
    606                   System.arraycopy(bytes, k*pix[k].length, pix[k], 0, 
    607                     pix[k].length); 
    608                 } 
    609                 ((ColorProcessor) ip).setRGB(pix[0], pix[1], 
    610                   pix.length >= 3 ? pix[2] : new byte[w*h]); 
    611                 stackO.addSlice(imageName + ":" + (j + 1), ip); 
    612               } 
    613               */ 
     596              ip = new ByteProcessor(w, h, bytes, null); 
     597              if (stackB == null) stackB = new ImageStack(w, h); 
     598              stackB.addSlice(imageName + ":" + (j + 1), ip); 
    614599            } 
    615600            else if (pixels instanceof short[]) { 
     
    621606              } 
    622607               
    623               for (int ch=0; ch<c; ch++) { 
    624                 short[] nb = new short[w * h]; 
    625                 if (c == 1) nb = s; 
    626                 else System.arraycopy(s, ch*w*h, nb, 0, nb.length); 
    627                 ip = new ShortProcessor(w, h, nb, null); 
    628                 if (stackS == null) stackS = new ImageStack(w, h); 
    629                 stackS.addSlice(imageName + ":" + (j + 1), ip); 
    630               } 
     608              ip = new ShortProcessor(w, h, s, null); 
     609              if (stackS == null) stackS = new ImageStack(w, h); 
     610              stackS.addSlice(imageName + ":" + (j + 1), ip); 
    631611            } 
    632612            else if (pixels instanceof int[]) { 
     
    638618              } 
    639619 
    640               for (int ch=0; ch<c; ch++) { 
    641                 int[] nb = new int[w * h]; 
    642                 if (c == 1) nb = s; 
    643                 else System.arraycopy(s, ch*w*h, nb, 0, nb.length); 
    644                 ip = new FloatProcessor(w, h, nb); 
    645                 if (stackF == null) stackF = new ImageStack(w, h); 
    646                 stackF.addSlice(imageName + ":" + (j + 1), ip); 
    647               } 
     620              ip = new FloatProcessor(w, h, s); 
     621              if (stackF == null) stackF = new ImageStack(w, h); 
     622              stackF.addSlice(imageName + ":" + (j + 1), ip); 
    648623            } 
    649624            else if (pixels instanceof float[]) { 
     
    655630              } 
    656631 
    657               for (int ch=0; ch<c; ch++) { 
    658                 float[] nb = new float[w * h]; 
    659                 if (c == 1) nb = f; 
    660                 else System.arraycopy(f, ch*w*h, nb, 0, nb.length); 
    661                 ip = new FloatProcessor(w, h, nb, null); 
     632              if (c == 1) { 
     633                ip = new FloatProcessor(w, h, f, null); 
    662634                if (stackF == null) stackF = new ImageStack(w, h); 
    663                  
     635 
    664636                if (stackB != null) { 
    665637                  ip = ip.convertToByte(true); 
     
    674646                else stackF.addSlice(imageName + ":" + (j + 1), ip); 
    675647              } 
     648              else { 
     649                if (stackO == null) stackO = new ImageStack(w, h); 
     650                float[][] pix = new float[c][w*h]; 
     651                if (!r.isInterleaved(id)) { 
     652                  for (int k=0; k<f.length; k+=c) { 
     653                    for (int l=0; l<c; l++) { 
     654                      pix[l][k / c] = f[k + l]; 
     655                    } 
     656                  } 
     657                } 
     658                else { 
     659                  for (int k=0; k<c; k++) { 
     660                    System.arraycopy(f, k*pix[k].length, pix[k], 0, 
     661                      pix[k].length); 
     662                  } 
     663                } 
     664                byte[][] bytes = new byte[c][w*h]; 
     665                for (int k=0; k<c; k++) { 
     666                  ip = new FloatProcessor(w, h, pix[k], null); 
     667                  ip = ip.convertToByte(true); 
     668                  bytes[k] = (byte[]) ip.getPixels(); 
     669                } 
     670                ip = new ColorProcessor(w, h); 
     671                ((ColorProcessor) ip).setRGB(bytes[0], bytes[1], 
     672                  pix.length >= 3 ? bytes[2] : new byte[w*h]); 
     673                stackO.addSlice(imageName + ":" + (j + 1), ip);   
     674              } 
    676675            } 
    677676            else if (pixels instanceof double[]) { 
     
    683682              } 
    684683              
    685               for (int ch=0; ch<c; ch++) { 
    686                 double[] nb = new double[w * h]; 
    687                 if (c == 1) nb = d; 
    688                 else System.arraycopy(d, ch*w*h, nb, 0, nb.length); 
    689                 ip = new FloatProcessor(w, h, nb); 
    690                 if (stackF == null) stackF = new ImageStack(w, h); 
    691                 stackF.addSlice(imageName + ":" + (j + 1), ip); 
    692               } 
     684              ip = new FloatProcessor(w, h, d); 
     685              if (stackF == null) stackF = new ImageStack(w, h); 
     686              stackF.addSlice(imageName + ":" + (j + 1), ip); 
    693687            } 
    694688          } 
     
    939933    FileStitcher fs, String id) 
    940934  { 
    941     adjustDisplay(imp); 
    942      
    943     // convert to RGB if needed 
     935    adjustDisplay(imp);  
     936 
     937    try {   
     938      // convert to RGB if needed 
    944939    
    945     try { 
    946       if (r.isRGB(id)) { 
     940      if (mergeChannels && r.getSizeC(id) > 1 &&  
     941        r.getPixelType(id) != FormatReader.FLOAT)  
     942      { 
    947943        int c = r.getSizeC(id); 
    948944        ImageStack s = imp.getStack(); 
    949945        ImageStack newStack = new ImageStack(s.getWidth(), s.getHeight()); 
    950         for (int i=0; i<r.getImageCount(id); i++) { 
    951           byte[][] bytes = new byte[c][]; 
    952           for (int j=0; j<c; j++) { 
    953             ImageProcessor p = s.getProcessor(i*c + j + 1).convertToByte(true); 
    954             bytes[j] = (byte[]) p.getPixels(); 
    955           } 
    956           ColorProcessor cp = new ColorProcessor(s.getWidth(), s.getHeight()); 
    957           cp.setRGB(bytes[0], bytes[1], bytes.length == 3 ? bytes[2] :  
    958             new byte[s.getWidth() * s.getHeight()]); 
    959           newStack.addSlice(s.getSliceLabel(i*c + 1), cp); 
     946        for (int i=0; i<s.getSize(); i++) { 
     947          if (r.getPixelType(id) != FormatReader.FLOAT) { 
     948            ImageProcessor p = s.getProcessor(i + 1).convertToByte(true); 
     949            newStack.addSlice(s.getSliceLabel(i + 1), p); 
     950          } 
     951          else { 
     952            float[] f = (float[]) s.getProcessor(i + 1).getPixels(); 
     953            byte[] bytes = new byte[f.length]; 
     954            for (int j=0; j<f.length; j++) { 
     955              bytes[j] = (byte) Float.floatToIntBits(f[j]); 
     956            } 
     957             
     958            ByteProcessor p = new ByteProcessor(s.getWidth(),  
     959              s.getHeight(), bytes, null); 
     960            newStack.addSlice(s.getSliceLabel(i + 1), p); 
     961          } 
    960962        } 
    961963        imp.setStack(imp.getTitle(), newStack); 
    962       } 
    963     } 
    964     catch (FormatException e) { } 
    965     catch (IOException e) { } 
     964        adjustDisplay(imp); 
     965 
     966        s = imp.getStack(); 
     967        newStack = new ImageStack(s.getWidth(), s.getHeight()); 
     968 
     969        for (int z=0; z<r.getSizeZ(id); z++) { 
     970          for (int t=0; t<r.getSizeT(id); t++) { 
     971            byte[][] bytes = new byte[c][]; 
     972            for (int ch=0; ch<c; ch++) { 
     973              int ndx = r.getIndex(id, z, ch, t) + 1; 
     974              bytes[ch] = (byte[]) s.getProcessor(ndx).getPixels(); 
     975            } 
     976            ColorProcessor cp = new ColorProcessor(s.getWidth(), s.getHeight()); 
     977            cp.setRGB(bytes[0], bytes[1], bytes.length == 3 ? bytes[2] : 
     978              new byte[s.getWidth() * s.getHeight()]); 
     979            newStack.addSlice(s.getSliceLabel( 
     980              r.getIndex(id, z, c - 1, t) + 1), cp); 
     981          } 
     982        } 
     983        imp.setStack(imp.getTitle(), newStack); 
     984      } 
    966985     
    967     try { 
    968986      if (stackFormat.equals(VIEW_STANDARD)) { 
    969987        imp.show(); 
Note: See TracChangeset for help on using the changeset viewer.