Changeset 6555


Ignore:
Timestamp:
06/22/10 16:51:52 (9 years ago)
Author:
curtis
Message:

Merge color mode progress to 4.2 branch.

Location:
branches/4.2/components
Files:
1 deleted
10 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/4.2/components

  • branches/4.2/components/bio-formats/src

  • branches/4.2/components/bio-formats/src/loci/formats/ChannelFiller.java

    r6477 r6555  
    5757  public ChannelFiller(IFormatReader r) { super(r); } 
    5858 
     59  // -- ChannelFiller methods -- 
     60 
     61  /** Returns true if the indices are being factored out. */ 
     62  public boolean isFilled() { 
     63    return reader.isIndexed() && !reader.isFalseColor(); 
     64  } 
     65 
    5966  // -- IFormatReader API methods -- 
    6067 
     
    6269  @Override 
    6370  public int getSizeC() { 
    64     if (passthrough()) return reader.getSizeC(); 
     71    if (!isFilled()) return reader.getSizeC(); 
    6572    return reader.getSizeC() * getLookupTableComponentCount(); 
    6673  } 
     
    6976  @Override 
    7077  public boolean isRGB() { 
    71     if (passthrough()) return reader.isRGB(); 
     78    if (!isFilled()) return reader.isRGB(); 
    7279    return getRGBChannelCount() > 1; 
    7380  } 
     
    7683  @Override 
    7784  public boolean isIndexed() { 
    78     if (passthrough()) return reader.isIndexed(); 
     85    if (!isFilled()) return reader.isIndexed(); 
    7986    return false; 
    8087  } 
     
    8390  @Override 
    8491  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
    85     if (passthrough()) return reader.get8BitLookupTable(); 
     92    if (!isFilled()) return reader.get8BitLookupTable(); 
    8693    return null; 
    8794  } 
     
    9097  @Override 
    9198  public short[][] get16BitLookupTable() throws FormatException, IOException { 
    92     if (passthrough()) return reader.get16BitLookupTable(); 
     99    if (!isFilled()) return reader.get16BitLookupTable(); 
    93100    return null; 
    94101  } 
     
    98105  public int[] getChannelDimLengths() { 
    99106    int[] cLengths = reader.getChannelDimLengths(); 
    100     if (passthrough()) return cLengths; 
     107    if (!isFilled()) return cLengths; 
    101108 
    102109    // in the case of a single channel, replace rather than append 
     
    114121  public String[] getChannelDimTypes() { 
    115122    String[] cTypes = reader.getChannelDimTypes(); 
    116     if (passthrough()) return cTypes; 
     123    if (!isFilled()) return cTypes; 
    117124 
    118125    // in the case of a single channel, leave type unchanged 
     
    156163    throws FormatException, IOException 
    157164  { 
    158     if (passthrough()) return reader.openBytes(no, buf, x, y, w, h); 
     165    if (!isFilled()) return reader.openBytes(no, buf, x, y, w, h); 
    159166 
    160167    // TODO: The pixel type should change to match the available color table. 
     
    224231  // -- Helper methods -- 
    225232 
    226   /** Whether to hand off all method calls directly to the wrapped reader. */ 
    227   private boolean passthrough() { 
    228     return !reader.isIndexed() || reader.isFalseColor(); 
    229   } 
    230  
    231233  /** Gets the number of color components in the lookup table. */ 
    232234  private int getLookupTableComponentCount() { 
  • branches/4.2/components/bio-formats/src/loci/formats/in/FakeReader.java

  • branches/4.2/components/loci-plugins

  • branches/4.2/components/loci-plugins/src/loci/plugins/in/ImagePlusReader.java

    r6524 r6555  
    2626package loci.plugins.in; 
    2727 
    28 import ij.CompositeImage; 
    2928import ij.ImagePlus; 
    3029import ij.ImageStack; 
    3130import ij.io.FileInfo; 
    32 import ij.process.ByteProcessor; 
    33 import ij.process.ColorProcessor; 
    34 import ij.process.FloatProcessor; 
    3531import ij.process.ImageProcessor; 
    36 import ij.process.LUT; 
    37 import ij.process.ShortProcessor; 
    38  
    39 import java.awt.Color; 
     32 
    4033import java.io.File; 
    4134import java.io.IOException; 
     
    5245import loci.common.services.ServiceException; 
    5346import loci.common.services.ServiceFactory; 
    54 import loci.formats.ChannelMerger; 
    5547import loci.formats.FilePattern; 
    5648import loci.formats.FormatException; 
     
    7466public class ImagePlusReader implements StatusReporter { 
    7567 
     68  // -- Constants -- 
     69 
     70  /** Special property for storing series number associated with the image. */ 
     71  public static final String PROP_SERIES = "Series"; 
     72 
    7673  // -- Fields -- 
    7774 
     
    174171    throws FormatException, IOException 
    175172  { 
    176     ImageProcessorReader reader = process.getReader(); 
    177     ImporterOptions options = process.getOptions(); 
     173    final ImageProcessorReader reader = process.getReader(); 
     174    final ImporterOptions options = process.getOptions(); 
    178175    reader.setSeries(s); 
    179176 
    180     boolean[] load = getPlanesToLoad(s); 
     177    final boolean[] load = getPlanesToLoad(s); 
    181178    int current = 0, total = 0; 
    182179    for (int j=0; j<reader.getImageCount(); j++) if (load[j]) total++; 
    183180 
    184     FileInfo fi = createFileInfo(); 
    185  
    186     ImageStack stackB = null; // for byte images (8-bit) 
    187     ImageStack stackS = null; // for short images (16-bit) 
    188     ImageStack stackF = null; // for floating point images (32-bit) 
    189     ImageStack stackO = null; // for all other images (24-bit RGB) 
    190  
    191     Region region = process.getCropRegion(s); 
     181    final FileInfo fi = createFileInfo(); 
     182    final Region region = process.getCropRegion(s); 
     183 
     184    ImageStack stack = null; 
    192185 
    193186    if (options.isVirtual()) { 
    194       // CTR FIXME - clean up this part 
    195       boolean doMerge = false; //options.isMergeChannels(); 
    196       boolean doColorize = false; //options.isColorize(); 
    197  
     187      // CTR FIXME: Make virtual stack work with different color modes? 
    198188      reader.setSeries(s); 
    199189      // NB: ImageJ 1.39+ is required for VirtualStack 
    200       BFVirtualStack virtualStackB = new BFVirtualStack(options.getId(), 
    201         reader, doColorize, doMerge, options.isRecord()); 
    202       stackB = virtualStackB; 
    203       if (doMerge) { 
    204         for (int j=0; j<reader.getImageCount(); j++) { 
    205           int[] zct = reader.getZCTCoords(j); 
    206           if (zct[1] > 0) continue; 
    207           ChannelMerger channelMerger = new ChannelMerger(reader); 
    208           int index = channelMerger.getIndex(zct[0], zct[1], zct[2]); 
    209           String label = constructSliceLabel(index, 
    210             channelMerger, process.getOMEMetadata(), s, 
    211             process.getZCount(s), process.getCCount(s), process.getTCount(s)); 
    212           virtualStackB.addSlice(label); 
    213         } 
    214       } 
    215       else { 
    216         for (int j=0; j<reader.getImageCount(); j++) { 
    217           String label = constructSliceLabel(j, 
    218             reader, process.getOMEMetadata(), s, 
    219             process.getZCount(s), process.getCCount(s), process.getTCount(s)); 
    220           virtualStackB.addSlice(label); 
    221         } 
     190      BFVirtualStack virtualStack = new BFVirtualStack(options.getId(), 
     191        reader, false, false, options.isRecord()); 
     192      stack = virtualStack; 
     193      for (int j=0; j<reader.getImageCount(); j++) { 
     194        String label = constructSliceLabel(j, 
     195          reader, process.getOMEMetadata(), s, 
     196          process.getZCount(s), process.getCCount(s), process.getTCount(s)); 
     197        virtualStack.addSlice(label); 
    222198      } 
    223199    } 
    224200    else { 
    225       // CTR CHECK 
    226       //if (r.isIndexed()) colorModels = new IndexColorModel[r.getSizeC()]; 
    227  
    228201      for (int i=0; i<reader.getImageCount(); i++) { 
    229202        if (!load[i]) continue; 
     
    237210 
    238211        // get image processor for ith plane 
    239         ImageProcessor[] p; 
    240         p = reader.openProcessors(i, region.x, region.y, 
    241           region.width, region.height); 
    242         ImageProcessor ip = p[0]; 
    243         if (p.length > 1) { 
    244           ip = ImagePlusTools.makeRGB(p).getProcessor(); 
     212        ImageProcessor[] p = reader.openProcessors(i, 
     213          region.x, region.y, region.width, region.height); 
     214        if (p == null || p.length == 0) { 
     215          throw new FormatException("Cannot read plane #" + i); 
    245216        } 
    246         if (ip == null) { 
    247           throw new FormatException("Cannot read ImageProcessor #" + i); 
    248         } 
    249  
    250         // CTR CHECK 
    251         //int channel = r.getZCTCoords(i)[1]; 
    252         //if (colorModels != null && p.length == 1) { 
    253         //  colorModels[channel] = (IndexColorModel) ip.getColorModel(); 
    254         //} 
    255217 
    256218        // add plane to image stack 
    257219        int w = region.width, h = region.height; 
    258         if (ip instanceof ByteProcessor) { 
    259           if (stackB == null) stackB = new ImageStack(w, h); 
    260           stackB.addSlice(label, ip); 
    261         } 
    262         else if (ip instanceof ShortProcessor) { 
    263           if (stackS == null) stackS = new ImageStack(w, h); 
    264           stackS.addSlice(label, ip); 
    265         } 
    266         else if (ip instanceof FloatProcessor) { 
    267           // merge image plane into existing stack if possible 
    268           if (stackB != null) { 
    269             throw new FormatException( 
    270               "Found a FloatProcessor, expected a ByteProcessor"); 
    271           } 
    272           else if (stackS != null) { 
    273             throw new FormatException( 
    274               "Found a FloatProcessor, expected a ShortProcessor"); 
    275           } 
    276           else { 
    277             if (stackF == null) stackF = new ImageStack(w, h); 
    278             stackF.addSlice(label, ip); 
    279           } 
    280         } 
    281         else if (ip instanceof ColorProcessor) { 
    282           if (stackO == null) stackO = new ImageStack(w, h); 
    283           stackO.addSlice(label, ip); 
    284         } 
     220        if (stack == null) stack = new ImageStack(w, h); 
     221 
     222        for (ImageProcessor ip : p) stack.addSlice(label, ip); 
    285223      } 
    286224    } 
     
    288226    notifyListeners(new StatusEvent(1, 1, "Creating image")); 
    289227 
    290     ImagePlus impB = createImage(stackB, s, fi); 
    291     ImagePlus impS = createImage(stackS, s, fi); 
    292     ImagePlus impF = createImage(stackF, s, fi); 
    293     ImagePlus impO = createImage(stackO, s, fi); 
    294     if (impB != null) imps.add(impB); 
    295     if (impS != null) imps.add(impS); 
    296     if (impF != null) imps.add(impF); 
    297     if (impO != null) imps.add(impO); 
     228    ImagePlus imp = createImage(stack, s, fi); 
     229    imps.add(imp); 
    298230  } 
    299231 
     
    309241 
    310242  private List<ImagePlus> applyColors(List<ImagePlus> imps) { 
    311     final ImporterOptions options = process.getOptions(); 
    312     final ImageProcessorReader reader = process.getReader(); 
    313  
    314     for (int image=0; image<imps.size(); image++) { 
    315       ImagePlus imp = imps.get(image); 
    316       int series = (Integer) imp.getProperty("Series"); 
    317       reader.setSeries(series); 
    318  
    319       // CTR FIXME - problems with default color mode 
    320       int mode = -1; 
    321       boolean indexed = reader.isIndexed(); 
    322       int sizeC = reader.getEffectiveSizeC(); 
    323       if (sizeC == 1 && 
    324         (options.isColorModeColorized() || options.isColorModeCustom())) 
    325       { 
    326         LUT lut = makeLUT(options.getDefaultCustomColor(0)); 
    327         if (options.isColorModeCustom()) { 
    328           lut = makeLUT(series, 0); 
    329         } 
    330         imp.getProcessor().setColorModel(lut); 
    331       } 
    332       else if (sizeC > 7) { 
    333         // NB: Cannot use CompositeImage when there are more than 
    334         // seven channels. 
    335         // CTR FIXME finish sizeC>7 case 
    336         loci.plugins.BF.warn(options.isQuiet(), "sizeC > 7");//TEMP 
    337       } 
    338       else if (options.isColorModeComposite()) mode = CompositeImage.COMPOSITE; 
    339       else if (options.isColorModeColorized()) mode = CompositeImage.COLOR; 
    340       else if (options.isColorModeGrayscale()) mode = CompositeImage.GRAYSCALE; 
    341       else if (options.isColorModeCustom()) mode = CompositeImage.COLOR; 
    342       else if (indexed && sizeC > 1) mode = CompositeImage.COLOR; 
    343  
    344       if (mode != -1) { 
    345         CompositeImage compImage = new CompositeImage(imp, mode); 
    346         LUT[] luts = null; 
    347         if (options.isColorModeCustom()) luts = makeLUTs(series); 
    348         else if (indexed) { 
    349           luts = new LUT[sizeC]; 
    350           for (int i=0; i<luts.length; i++) { 
    351             byte[][] lut = null; 
    352             try { 
    353               int index = reader.getIndex(0, i, 0); 
    354               reader.openBytes(index, 0, 0, 1, 1); 
    355               lut = reader.get8BitLookupTable(); 
    356             } 
    357             catch (FormatException e) { } 
    358             catch (IOException e) { } 
    359             if (lut != null) { 
    360               luts[i] = new LUT(lut[0], lut[1], lut[2]); 
    361             } 
    362             else { 
    363               luts = null; 
    364               break; 
    365             } 
    366           } 
    367         } 
    368         if (luts != null) compImage.setLuts(luts); 
    369         imps.set(image, compImage); 
    370       } 
    371     } 
    372     return imps; 
    373   } 
    374  
    375   private LUT[] makeLUTs(int series) { 
    376     final ImageProcessorReader reader = process.getReader(); 
    377     reader.setSeries(series); 
    378     LUT[] luts = new LUT[reader.getSizeC()]; 
    379     for (int c=0; c<luts.length; c++) luts[c] = makeLUT(series, c); 
    380     return luts; 
    381   } 
    382  
    383   private LUT makeLUT(int series, int channel) { 
    384     final ImporterOptions options = process.getOptions(); 
    385     Color color = options.getCustomColor(series, channel); 
    386     if (color == null) color = options.getDefaultCustomColor(channel); 
    387     return makeLUT(color); 
    388   } 
    389  
    390   private LUT makeLUT(Color color) { 
    391     final int red = color.getRed(); 
    392     final int green = color.getGreen(); 
    393     final int blue = color.getBlue(); 
    394     final int lutLength = 256; 
    395     final int lutDivisor = lutLength - 1; 
    396     byte[] r = new byte[lutLength]; 
    397     byte[] g = new byte[lutLength]; 
    398     byte[] b = new byte[lutLength]; 
    399     for (int i=0; i<lutLength; i++) { 
    400       r[i] = (byte) (i * red / lutDivisor); 
    401       g[i] = (byte) (i * green / lutDivisor); 
    402       b[i] = (byte) (i * blue / lutDivisor); 
    403     } 
    404     return new LUT(r, g, b); 
     243    return new Colorizer(process).applyColors(imps); 
    405244  } 
    406245 
     
    541380    String metadata = process.getOriginalMetadata().toString(); 
    542381    imp.setProperty("Info", metadata); 
    543     imp.setProperty("Series", series); 
     382    imp.setProperty(PROP_SERIES, series); 
    544383 
    545384    // retrieve the spatial calibration information, if available 
  • branches/4.2/components/loci-plugins/src/loci/plugins/in/ImportProcess.java

    r6514 r6555  
    187187  } 
    188188  /** Valid only after {@link ImportStep#READER}. */ 
    189   public IFormatReader getImageReader() { 
     189  public ImageReader getImageReader() { 
    190190    assertStep(ImportStep.READER); 
    191191    return imageReader; 
     
    416416    r.setId(options.getId()); 
    417417 
    418     final boolean fillIndexed; 
    419     if (r.isIndexed()) { 
    420       final int bpp = FormatTools.getBytesPerPixel(r.getPixelType()); 
    421       final byte[][] lut8 = r.get8BitLookupTable(); 
    422       final boolean defaultColorMode = options.isColorModeDefault(); 
    423  
    424       // NB: ImageJ only supports 8-bit RGB color tables. 
    425       // In addition, we only keep the indices in default color mode. 
    426       final boolean keepColorTable = defaultColorMode && 
    427         bpp == 1 && lut8 != null && lut8.length >= 1 && lut8.length <= 3; 
    428  
    429       if (r.isFalseColor()) { 
    430         // false color; never fill the indices 
    431         fillIndexed = false; 
    432         if (!keepColorTable) { 
    433           // warn the user that we'll have to throw away the color table 
    434           BF.warn(options.isQuiet(), 
    435             "false color table will be lost: " + getIdName()); 
    436         } 
    437       } 
    438       else { 
    439         // true color; if we can't keep the color table, then fill the indices 
    440         fillIndexed = !keepColorTable; 
    441       } 
    442     } 
    443     else fillIndexed = false; // no need to fill non-indexed data 
    444     if (fillIndexed) { 
    445       r = channelFiller = new ChannelFiller(r); 
     418    r = channelFiller = new ChannelFiller(r); 
     419    if (channelFiller.isFilled()) { 
    446420      BF.warn(options.isQuiet(), "index values will be lost: " + getIdName()); 
    447421    } 
  • branches/4.2/components/loci-plugins/src/loci/plugins/macro/LociFunctions.java

    r6477 r6555  
    156156  { 
    157157    ImageProcessor[] ip = r.openProcessors(no.intValue()); 
    158     ImagePlusTools.makeRGB(title, ip).show(); 
     158    // CTR FIXME - Ext.openImage 
     159    //ImagePlusTools.makeRGB(title, ip).show(); 
    159160  } 
    160161 
     
    164165    ImageProcessor[] ip = r.openProcessors(no.intValue(), 
    165166      x.intValue(), y.intValue(), w.intValue(), h.intValue()); 
    166     ImagePlusTools.makeRGB(title, ip).show(); 
     167    // CTR FIXME - Ext.openSubImage 
     168    //ImagePlusTools.makeRGB(title, ip).show(); 
    167169  } 
    168170 
  • branches/4.2/components/loci-plugins/src/loci/plugins/util/ImagePlusTools.java

    r6524 r6555  
    6262   * RGB ImagePlus. 
    6363   */ 
     64/* FIXME remove makeRGB methods 
    6465  public static ImagePlus makeRGB(ImageProcessor[] p) { 
    6566    return makeRGB("", p); 
    6667  } 
     68*/ 
    6769 
    6870  /** 
     
    7072   * RGB ImagePlus. 
    7173   */ 
     74/* FIXME remove makeRGB methods 
    7275  public static ImagePlus makeRGB(String title, ImageProcessor[] p) { 
    7376    if (p.length == 1) return new ImagePlus(title, p[0]); 
     
    120123    return imp; 
    121124  } 
     125*/ 
    122126 
    123127  /** Applies spatial calibrations to an image stack. */ 
  • branches/4.2/components/loci-plugins/src/loci/plugins/util/ImageProcessorReader.java

    r6534 r6555  
    2929import ij.process.FloatProcessor; 
    3030import ij.process.ImageProcessor; 
     31import ij.process.LUT; 
    3132import ij.process.ShortProcessor; 
    3233 
    33 import java.awt.image.ColorModel; 
    34 import java.awt.image.IndexColorModel; 
    3534import java.io.IOException; 
    3635 
     
    130129 
    131130    // create a color model for this plane (null means default) 
    132     final ColorModel cm = createColorModel(); 
     131    final LUT cm = createColorModel(); 
    133132 
    134133    // convert byte array to appropriate primitive array type 
     
    215214  // -- Helper methods -- 
    216215 
    217   private ColorModel createColorModel() throws FormatException, IOException { 
     216  private LUT createColorModel() throws FormatException, IOException { 
    218217    // NB: If a color table is present, we might as well use it, 
    219218    // regardless of the value of isIndexed. 
     
    222221    byte[][] byteTable = get8BitLookupTable(); 
    223222    if (byteTable == null) byteTable = convertTo8Bit(get16BitLookupTable()); 
    224     if (byteTable == null) return null; 
    225     return new IndexColorModel(8, byteTable[0].length, 
    226       byteTable[0], byteTable[1], byteTable[2]); 
     223    if (byteTable == null || byteTable.length == 0) return null; 
     224 
     225    // extract red, green and blue elements 
     226    final int colors = byteTable.length; 
     227    final int samples = byteTable[0].length; 
     228    final byte[] r = colors >= 1 ? byteTable[0] : new byte[samples]; 
     229    final byte[] g = colors >= 2 ? byteTable[1] : new byte[samples]; 
     230    final byte[] b = colors >= 3 ? byteTable[2] : new byte[samples]; 
     231    LUT lut = new LUT(8, samples, r, g, b); 
     232    lut.min = 0; 
     233    lut.max = 255; 
     234    return lut; 
    227235  } 
    228236 
Note: See TracChangeset for help on using the changeset viewer.