diff --git a/src/main/java/bdv/ij/OpenImagePlusPlugIn.java b/src/main/java/bdv/ij/OpenImagePlusPlugIn.java index 2251f36b0e38ceffc193b06523acbb722bf73d03..642284820afbec0694fdf9f3ad53481ff440337a 100644 --- a/src/main/java/bdv/ij/OpenImagePlusPlugIn.java +++ b/src/main/java/bdv/ij/OpenImagePlusPlugIn.java @@ -96,40 +96,43 @@ public class OpenImagePlusPlugIn implements Command AbstractSpimData< ? > spimData; CacheControl cache = null; + int nTimepoints = 1; int setup_id_offset = 0; - ArrayList< ImagePlus > imgList = new ArrayList< ImagePlus >(); + ArrayList< ImagePlus > imgList = new ArrayList<>(); for ( int i = 0; i < nImages; i++ ) { if ( !gd.getNextBoolean() ) continue; ImagePlus imp = WindowManager.getImage( idList[ i ] ); - imgList.add( imp ); spimData = load( imp, converterSetups, sources, setup_id_offset ); if ( spimData != null ) + { + imgList.add( imp ); cache = ( ( ViewerImgLoader ) spimData.getSequenceDescription().getImgLoader() ).getCacheControl(); - - setup_id_offset += imp.getNChannels(); + setup_id_offset += imp.getNChannels(); + nTimepoints = Math.max( nTimepoints, imp.getNFrames() ); + } } - int nTimepoints = 1; - final BigDataViewer bdv = BigDataViewer.open( converterSetups, sources, - nTimepoints, cache, - "BigDataViewer", new ProgressWriterIJ(), ViewerOptions.options() ); - - final SetupAssignments sa = bdv.getSetupAssignments(); - final VisibilityAndGrouping vg = bdv.getViewer().getVisibilityAndGrouping(); - vg.setFusedEnabled( true ); - - int channelOffset = 0; - for ( ImagePlus imp : imgList ) + if ( !imgList.isEmpty() ) { - if ( imp.isComposite() ) - transferChannelSettings( channelOffset, ( CompositeImage ) imp, sa, vg ); - else - transferImpSettings( channelOffset, imp, sa ); + final BigDataViewer bdv = BigDataViewer.open( converterSetups, sources, + nTimepoints, cache, + "BigDataViewer", new ProgressWriterIJ(), ViewerOptions.options() ); - channelOffset += imp.getNChannels(); + final SetupAssignments sa = bdv.getSetupAssignments(); + final VisibilityAndGrouping vg = bdv.getViewer().getVisibilityAndGrouping(); + + int channelOffset = 0; + int numActiveChannels = 0; + for ( ImagePlus imp : imgList ) + { + numActiveChannels += transferChannelVisibility( channelOffset, imp,vg ); + transferChannelSettings( channelOffset, imp, sa ); + channelOffset += imp.getNChannels(); + } + vg.setDisplayMode( numActiveChannels > 1 ? DisplayMode.FUSED : DisplayMode.SINGLE ); } } @@ -145,14 +148,14 @@ public class OpenImagePlusPlugIn implements Command case ImagePlus.COLOR_RGB: break; default: - IJ.showMessage( "Only 8, 16, 32-bit images and RGB images are supported currently!" ); + IJ.showMessage( imp.getShortTitle() + ": Only 8, 16, 32-bit images and RGB images are supported currently!" ); return null; } // check the image dimensionality if ( imp.getNDimensions() < 3 ) { - IJ.showMessage( "Image must be at least 3-dimensional!" ); + IJ.showMessage( imp.getShortTitle() + ": Image must be at least 3-dimensional!" ); return null; } @@ -167,7 +170,7 @@ public class OpenImagePlusPlugIn implements Command final int w = imp.getWidth(); final int h = imp.getHeight(); final int d = imp.getNSlices(); - final FinalDimensions size = new FinalDimensions( new int[] { w, h, d } ); + final FinalDimensions size = new FinalDimensions( w, h, d ); // propose reasonable mipmap settings // final ExportMipmapInfo autoMipmapSettings = ProposeMipmaps.proposeMipmaps( new BasicViewSetup( 0, "", size, voxelSize ) ); @@ -247,33 +250,65 @@ public class OpenImagePlusPlugIn implements Command return spimData; } - protected void transferChannelSettings( int channelOffset, final CompositeImage ci, final SetupAssignments setupAssignments, final VisibilityAndGrouping visibility ) + /** + * @return number of setups that were set active. + */ + protected int transferChannelVisibility( int channelOffset, final ImagePlus imp, final VisibilityAndGrouping visibility ) { - final int nChannels = ci.getNChannels(); - final int mode = ci.getCompositeMode(); - final boolean transferColor = mode == IJ.COMPOSITE || mode == IJ.COLOR; - for ( int c = 0; c < nChannels; ++c ) - { - final LUT lut = ci.getChannelLut( c + 1 ); - final ConverterSetup setup = setupAssignments.getConverterSetups().get( channelOffset + c ); - if ( transferColor ) - setup.setColor( new ARGBType( lut.getRGB( 255 ) ) ); - setup.setDisplayRange( lut.min, lut.max ); - } - if ( mode == IJ.COMPOSITE ) + final int nChannels = imp.getNChannels(); + final CompositeImage ci = imp.isComposite() ? ( CompositeImage ) imp : null; + if ( ci != null && ci.getCompositeMode() == IJ.COMPOSITE ) { final boolean[] activeChannels = ci.getActiveChannels(); + int numActiveChannels = 0; for ( int i = 0; i < activeChannels.length; ++i ) - visibility.setSourceActive( i, activeChannels[ i ] ); + { + final int setup = channelOffset + i; + visibility.setSourceActive( setup, activeChannels[ i ] ); + visibility.setCurrentSource( setup ); + numActiveChannels += activeChannels[ i ] ? 1 : 0; + } + return numActiveChannels; } else - visibility.setDisplayMode( DisplayMode.SINGLE ); - visibility.setCurrentSource( ci.getChannel() - 1 ); + { + final int activeChannel = imp.getChannel() - 1; + for ( int i = 0; i < nChannels; ++i ) + visibility.setSourceActive( channelOffset + i, i == activeChannel ); + visibility.setCurrentSource( channelOffset + activeChannel ); + return 1; + } } - protected void transferImpSettings( int setupIndex, final ImagePlus imp, final SetupAssignments setupAssignments ) + protected void transferChannelSettings( int channelOffset, final ImagePlus imp, final SetupAssignments setupAssignments ) { - final ConverterSetup setup = setupAssignments.getConverterSetups().get( setupIndex ); - setup.setDisplayRange( imp.getDisplayRangeMin(), imp.getDisplayRangeMax() ); + final int nChannels = imp.getNChannels(); + final CompositeImage ci = imp.isComposite() ? ( CompositeImage ) imp : null; + if ( ci != null ) + { + final int mode = ci.getCompositeMode(); + final boolean transferColor = mode == IJ.COMPOSITE || mode == IJ.COLOR; + for ( int c = 0; c < nChannels; ++c ) + { + final LUT lut = ci.getChannelLut( c + 1 ); + final ConverterSetup setup = setupAssignments.getConverterSetups().get( channelOffset + c ); + if ( transferColor ) + setup.setColor( new ARGBType( lut.getRGB( 255 ) ) ); + setup.setDisplayRange( lut.min, lut.max ); + } + } + else + { + final double displayRangeMin = imp.getDisplayRangeMin(); + final double displayRangeMax = imp.getDisplayRangeMax(); + for ( int i = 0; i < nChannels; ++i ) + { + final ConverterSetup setup = setupAssignments.getConverterSetups().get( channelOffset + i ); + final LUT[] luts = imp.getLuts(); + if ( luts.length != 0 ) + setup.setColor( new ARGBType( luts[ 0 ].getRGB( 255 ) ) ); + setup.setDisplayRange( displayRangeMin, displayRangeMax ); + } + } } }