Changeset 6342


Ignore:
Timestamp:
05/18/10 17:11:08 (9 years ago)
Author:
curtis
Message:

Initial implementation for custom color mode.

Location:
trunk/components/loci-plugins/src/loci/plugins/in
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/loci-plugins/src/loci/plugins/in/ColorDialog.java

    r6338 r6342  
    6161  // -- Constants -- 
    6262 
    63   /** Default custom colors for each channel. */ 
    64   private static final Color[] DEFAULT_COLORS = { 
    65     Color.red, 
    66     Color.green, 
    67     Color.blue, 
    68     Color.white, 
    69     Color.cyan, 
    70     Color.magenta, 
    71     Color.yellow 
    72   }; 
    7363  private static final Dimension SWATCH_SIZE = new Dimension(100, 50); 
    7464 
     
    9888      for (int c=0; c<reader.getSizeC(); c++) { 
    9989        Color color = options.getCustomColor(s, c); 
    100         if (color == null) color = DEFAULT_COLORS[c % DEFAULT_COLORS.length]; 
     90        if (color == null) color = options.getDefaultCustomColor(c); 
    10191        gd.addSlider(makeLabel("Red:", s, c), 0, 255, color.getRed()); 
    10292        gd.addSlider(makeLabel("Green:", s, c), 0, 255, color.getGreen()); 
  • trunk/components/loci-plugins/src/loci/plugins/in/ImagePlusReader.java

    r6326 r6342  
    3737import ij.process.ShortProcessor; 
    3838 
     39import java.awt.Color; 
    3940import java.io.File; 
    4041import java.io.IOException; 
     
    152153 
    153154    // concatenate compatible images 
    154     if (options.isConcatenate()) imps = new Concatenator().concatenate(imps); 
     155    imps = concatenate(imps); 
    155156 
    156157    // colorize images, as appropriate 
    157     // CTR FIXME - various problems with color mode 
    158     int mode = -1; 
    159     LUT[] luts = null; 
    160     if (options.isColorModeComposite()) mode = CompositeImage.COMPOSITE; 
    161     else if (options.isColorModeColorized()) mode = CompositeImage.COLOR; 
    162     else if (options.isColorModeGrayscale()) mode = CompositeImage.GRAYSCALE; 
    163     else if (options.isColorModeCustom()) mode = CompositeImage.COLOR; 
    164     if (mode != -1) { 
    165       List<ImagePlus> compositeImps = new ArrayList<ImagePlus>(); 
    166       for (ImagePlus imp : imps) { 
    167         CompositeImage compImage = new CompositeImage(imp, mode); 
    168         if (luts != null) compImage.setLuts(luts); 
    169         compositeImps.add(compImage); 
    170       } 
    171       imps = compositeImps; 
    172     } 
     158    imps = applyColors(imps); 
    173159 
    174160    // split dimensions, as appropriate 
    175     boolean sliceC = options.isSplitChannels(); 
    176     boolean sliceZ = options.isSplitFocalPlanes(); 
    177     boolean sliceT = options.isSplitTimepoints(); 
    178     if (sliceC || sliceZ || sliceT) { 
    179       String stackOrder = process.getStackOrder(); 
    180       List<ImagePlus> slicedImps = new ArrayList<ImagePlus>(); 
    181       for (ImagePlus imp : imps) { 
    182         ImagePlus[] results = new Slicer().reslice(imp, 
    183           sliceC, sliceZ, sliceT, stackOrder); 
    184         for (ImagePlus result : results) slicedImps.add(result); 
    185       } 
    186       imps = slicedImps; 
    187     } 
     161    imps = splitDims(imps); 
    188162 
    189163    // end timing 
    190     long endTime = System.currentTimeMillis(); 
    191     double elapsed = (endTime - startTime) / 1000.0; 
    192     if (reader.getImageCount() == 1) { 
    193       notifyListeners(new StatusEvent("Bio-Formats: " + elapsed + " seconds")); 
    194     } 
    195     else { 
    196       long average = (endTime - startTime) / reader.getImageCount(); 
    197       notifyListeners(new StatusEvent("Bio-Formats: " + 
    198         elapsed + " seconds (" + average + " ms per plane)")); 
    199     } 
     164    finishTiming(); 
    200165 
    201166    return imps; 
    202   } 
    203  
    204   private long startTime, time; 
    205   private void startTiming() { 
    206     startTime = time = System.currentTimeMillis(); 
    207   } 
    208   private void updateTiming(int s, int i, int current, int total) { 
    209     ImageProcessorReader reader = process.getReader(); 
    210     long clock = System.currentTimeMillis(); 
    211     if (clock - time >= 100) { 
    212       String sLabel = reader.getSeriesCount() > 1 ? 
    213         ("series " + (s + 1) + ", ") : ""; 
    214       String pLabel = "plane " + (i + 1) + "/" + total; 
    215       notifyListeners(new StatusEvent("Reading " + sLabel + pLabel)); 
    216       time = clock; 
    217     } 
    218     notifyListeners(new StatusEvent(current, total, null)); 
    219   } 
    220  
    221   private FileInfo createFileInfo() { 
    222     FileInfo fi = new FileInfo(); 
    223  
    224     // populate common FileInfo fields 
    225     String idDir = process.getIdLocation() == null ? 
    226       null : process.getIdLocation().getParent(); 
    227     if (idDir != null && !idDir.endsWith(File.separator)) { 
    228       idDir += File.separator; 
    229     } 
    230     fi.fileName = process.getIdName(); 
    231     fi.directory = idDir; 
    232  
    233     // dump OME-XML to ImageJ's description field, if available 
    234     try { 
    235       ServiceFactory factory = new ServiceFactory(); 
    236       OMEXMLService service = factory.getInstance(OMEXMLService.class); 
    237       fi.description = service.getOMEXML(process.getOMEMetadata()); 
    238     } 
    239     catch (DependencyException de) { } 
    240     catch (ServiceException se) { } 
    241  
    242     return fi; 
    243167  } 
    244168 
     
    367291    if (impF != null) imps.add(impF); 
    368292    if (impO != null) imps.add(impO); 
     293  } 
     294 
     295  private List<ImagePlus> concatenate(List<ImagePlus> imps) { 
     296    final ImporterOptions options = process.getOptions(); 
     297    if (options.isConcatenate()) imps = new Concatenator().concatenate(imps); 
     298    return imps; 
     299  } 
     300 
     301  private List<ImagePlus> applyColors(List<ImagePlus> imps) { 
     302    final ImporterOptions options = process.getOptions(); 
     303 
     304    // CTR FIXME - problems with single channel data 
     305    // CTR FIXME - problems with sizeC > 7 
     306    // CTR FIXME - problems with default color mode 
     307    int mode = -1; 
     308    if (options.isColorModeComposite()) mode = CompositeImage.COMPOSITE; 
     309    else if (options.isColorModeColorized()) mode = CompositeImage.COLOR; 
     310    else if (options.isColorModeGrayscale()) mode = CompositeImage.GRAYSCALE; 
     311    else if (options.isColorModeCustom()) mode = CompositeImage.COLOR; 
     312    if (mode != -1) { 
     313      List<ImagePlus> compositeImps = new ArrayList<ImagePlus>(); 
     314      for (ImagePlus imp : imps) { 
     315        CompositeImage compImage = new CompositeImage(imp, mode); 
     316        LUT[] luts = null; 
     317        int series = (Integer) imp.getProperty("Series"); 
     318        if (options.isColorModeCustom()) luts = makeLUTs(series); 
     319        if (luts != null) compImage.setLuts(luts); 
     320        compositeImps.add(compImage); 
     321      } 
     322      imps = compositeImps; 
     323    } 
     324    return imps; 
     325  } 
     326 
     327  private List<ImagePlus> splitDims(List<ImagePlus> imps) { 
     328    final ImporterOptions options = process.getOptions(); 
     329 
     330    boolean sliceC = options.isSplitChannels(); 
     331    boolean sliceZ = options.isSplitFocalPlanes(); 
     332    boolean sliceT = options.isSplitTimepoints(); 
     333    if (sliceC || sliceZ || sliceT) { 
     334      String stackOrder = process.getStackOrder(); 
     335      List<ImagePlus> slicedImps = new ArrayList<ImagePlus>(); 
     336      for (ImagePlus imp : imps) { 
     337        ImagePlus[] results = new Slicer().reslice(imp, 
     338          sliceC, sliceZ, sliceT, stackOrder); 
     339        for (ImagePlus result : results) slicedImps.add(result); 
     340      } 
     341      imps = slicedImps; 
     342    } 
     343    return imps; 
     344  } 
     345   
     346 
     347  private LUT[] makeLUTs(int series) { 
     348    final ImageProcessorReader reader = process.getReader(); 
     349    reader.setSeries(series); 
     350    LUT[] luts = new LUT[reader.getSizeC()]; 
     351    for (int c=0; c<luts.length; c++) luts[c] = makeLUT(series, c); 
     352    return luts; 
     353  } 
     354   
     355  private LUT makeLUT(int series, int channel) { 
     356    final ImporterOptions options = process.getOptions(); 
     357    Color color = options.getCustomColor(series, channel); 
     358    if (color == null) color = options.getDefaultCustomColor(channel); 
     359    return makeLUT(color); 
     360  } 
     361   
     362  private LUT makeLUT(Color color) { 
     363    final int red = color.getRed(); 
     364    final int green = color.getGreen(); 
     365    final int blue = color.getBlue(); 
     366    final int lutLength = 256; 
     367    byte[] r = new byte[lutLength]; 
     368    byte[] g = new byte[lutLength]; 
     369    byte[] b = new byte[lutLength]; 
     370    for (int i=0; i<lutLength; i++) { 
     371      r[i] = (byte) (i * red / lutLength); 
     372      g[i] = (byte) (i * green / lutLength); 
     373      b[i] = (byte) (i * blue / lutLength); 
     374    } 
     375    return new LUT(r, g, b); 
     376  } 
     377     
     378  private FileInfo createFileInfo() { 
     379    FileInfo fi = new FileInfo(); 
     380 
     381    // populate common FileInfo fields 
     382    String idDir = process.getIdLocation() == null ? 
     383      null : process.getIdLocation().getParent(); 
     384    if (idDir != null && !idDir.endsWith(File.separator)) { 
     385      idDir += File.separator; 
     386    } 
     387    fi.fileName = process.getIdName(); 
     388    fi.directory = idDir; 
     389 
     390    // dump OME-XML to ImageJ's description field, if available 
     391    try { 
     392      ServiceFactory factory = new ServiceFactory(); 
     393      OMEXMLService service = factory.getInstance(OMEXMLService.class); 
     394      fi.description = service.getOMEXML(process.getOMEMetadata()); 
     395    } 
     396    catch (DependencyException de) { } 
     397    catch (ServiceException se) { } 
     398 
     399    return fi; 
    369400  } 
    370401 
     
    412443    ImagePlus imp = null; 
    413444    if (options.isVirtual()) { 
    414       imp = new VirtualImagePlus(title, stack); 
    415       ((VirtualImagePlus) imp).setReader(reader); 
     445      VirtualImagePlus vip = new VirtualImagePlus(title, stack); 
     446      vip.setReader(reader); 
     447      imp = vip; 
    416448    } 
    417449    else imp = new ImagePlus(title, stack); 
     
    420452    String metadata = process.getOriginalMetadata().toString(); 
    421453    imp.setProperty("Info", metadata); 
     454    imp.setProperty("Series", series); 
    422455 
    423456    // retrieve the spatial calibration information, if available 
     
    426459    imp.setDimensions(cCount, zCount, tCount); 
    427460 
    428     boolean hyper = options.isViewHyperstack() || options.isViewBrowser(); 
    429     imp.setOpenAsHyperStack(hyper); 
     461    imp.setOpenAsHyperStack(true); 
    430462 
    431463    if (options.isAutoscale()) { 
     
    442474//    boolean windowless = options.isWindowless(); 
    443475 
    444     // CTR CHECK 
    445     //if (imp.isVisible() && !options.isVirtual()) { 
    446     //  String mergeOptions = windowless ? options.getMergeOption() : null; 
    447     //  imp = Colorizer.colorize(imp, true, stackOrder, null, r.getSeries(), mergeOptions, options.isViewHyperstack()); 
    448     //  // CTR FIXME finish this 
    449     //  if (WindowManager.getCurrentImage().getID() != imp.getID()) imp.close(); 
    450     //} 
    451476 
    452477    // NB: ImageJ 1.39+ is required for hyperstacks 
    453478 
    454 //    if (!options.isConcatenate()) { 
    455479//      boolean hyper = options.isViewHyperstack() || options.isViewBrowser(); 
    456480// 
     
    562586  } 
    563587 
     588  // -- Helper methods - timing -- 
     589 
     590  private long startTime, time; 
     591 
     592  private void startTiming() { 
     593    startTime = time = System.currentTimeMillis(); 
     594  } 
     595 
     596  private void updateTiming(int s, int i, int current, int total) { 
     597    final ImageProcessorReader reader = process.getReader(); 
     598 
     599    long clock = System.currentTimeMillis(); 
     600    if (clock - time >= 100) { 
     601      String sLabel = reader.getSeriesCount() > 1 ? 
     602        ("series " + (s + 1) + ", ") : ""; 
     603      String pLabel = "plane " + (i + 1) + "/" + total; 
     604      notifyListeners(new StatusEvent("Reading " + sLabel + pLabel)); 
     605      time = clock; 
     606    } 
     607    notifyListeners(new StatusEvent(current, total, null)); 
     608  } 
     609 
     610  private void finishTiming() { 
     611    final ImageProcessorReader reader = process.getReader(); 
     612 
     613    long endTime = System.currentTimeMillis(); 
     614    double elapsed = (endTime - startTime) / 1000.0; 
     615    if (reader.getImageCount() == 1) { 
     616      notifyListeners(new StatusEvent("Bio-Formats: " + elapsed + " seconds")); 
     617    } 
     618    else { 
     619      long average = (endTime - startTime) / reader.getImageCount(); 
     620      notifyListeners(new StatusEvent("Bio-Formats: " + 
     621        elapsed + " seconds (" + average + " ms per plane)")); 
     622    } 
     623  } 
     624 
    564625} 
  • trunk/components/loci-plugins/src/loci/plugins/in/ImporterOptions.java

    r6325 r6342  
    109109  public static final String ORDER_XYTZC   = "XYTZC"; 
    110110 
     111  /** Default custom colors for each channel. */ 
     112  private static final Color[] DEFAULT_COLORS = { 
     113    Color.red, 
     114    Color.green, 
     115    Color.blue, 
     116    Color.white, 
     117    Color.cyan, 
     118    Color.magenta, 
     119    Color.yellow 
     120  }; 
     121 
    111122  // -- Fields -- secondary values -- 
    112123 
     
    408419    set(list, c, color, null); 
    409420  } 
     421  public Color getDefaultCustomColor(int c) { 
     422    return DEFAULT_COLORS[c % DEFAULT_COLORS.length]; 
     423  } 
    410424 
    411425  // -- Helper methods - miscellaneous -- 
Note: See TracChangeset for help on using the changeset viewer.