|
5 | 5 | import ch.epfl.biop.bdv.img.bioformats.BioFormatsHelper; |
6 | 6 | import ch.epfl.biop.bdv.img.opener.OpenerSettings; |
7 | 7 | import mpicbg.spim.data.generic.AbstractSpimData; |
| 8 | +import mpicbg.spim.data.generic.sequence.BasicViewSetup; |
| 9 | +import mpicbg.spim.data.sequence.FinalVoxelDimensions; |
| 10 | +import mpicbg.spim.data.sequence.VoxelDimensions; |
8 | 11 | import net.imglib2.type.NativeType; |
9 | 12 | import net.imglib2.type.numeric.NumericType; |
10 | 13 |
|
11 | 14 | import java.io.File; |
| 15 | +import java.lang.reflect.Method; |
12 | 16 | import java.util.ArrayList; |
| 17 | +import java.util.Arrays; |
13 | 18 | import java.util.List; |
14 | 19 |
|
15 | 20 | public class BioFormatsImageData< T extends NumericType< T > & NativeType< T > > extends SpimDataImageData< T > |
@@ -48,16 +53,49 @@ public BioFormatsImageData( String uri, SharedQueue sharedQueue ) |
48 | 53 | .setSerie( i ) |
49 | 54 | .useBFMemo( false ); |
50 | 55 |
|
51 | | - if ( usePixelUnits ) |
52 | | - settings.unit( "pixel" ); |
| 56 | + // Throws NPE, https://github.com/mobie/mobie-viewer-fiji/issues/1247 |
| 57 | + // if ( usePixelUnits ) |
| 58 | + // settings.unit( "pixel" ); |
53 | 59 |
|
54 | 60 | settingsList.add( settings ); |
55 | 61 | } |
56 | 62 |
|
57 | | - return OpenersToSpimData.getSpimData( settingsList ); |
| 63 | + AbstractSpimData< ? > spimData = OpenersToSpimData.getSpimData( settingsList ); |
| 64 | + |
| 65 | + // Since the above throws a NPE, we resort to |
| 66 | + if ( usePixelUnits ) |
| 67 | + setAllVoxelUnitsToPixel( spimData ); |
| 68 | + |
| 69 | + return spimData; |
58 | 70 | } |
59 | 71 | } ); |
60 | 72 | this.uri = uri; |
61 | 73 | this.sharedQueue = sharedQueue; |
62 | 74 | } |
| 75 | + |
| 76 | + private static void setAllVoxelUnitsToPixel(AbstractSpimData<?> spimData) { |
| 77 | + |
| 78 | + spimData.getSequenceDescription().getViewSetupsOrdered().forEach(setup -> { |
| 79 | + final Method setVoxelSize; |
| 80 | + try |
| 81 | + { |
| 82 | + setVoxelSize = BasicViewSetup.class.getDeclaredMethod("setVoxelSize", VoxelDimensions.class); |
| 83 | + } |
| 84 | + catch ( NoSuchMethodException ex ) |
| 85 | + { |
| 86 | + throw new RuntimeException( ex ); |
| 87 | + } |
| 88 | + setVoxelSize.setAccessible(true); |
| 89 | + |
| 90 | + try { |
| 91 | + final double[] dims = new double[setup.getVoxelSize().numDimensions()]; |
| 92 | + Arrays.fill(dims,1.0); |
| 93 | + setVoxelSize.invoke(setup, new FinalVoxelDimensions("pixel", dims)); |
| 94 | + } |
| 95 | + catch ( Exception e ) |
| 96 | + { |
| 97 | + throw new RuntimeException("Failed to set voxel size for setup " + setup.getId(), e); |
| 98 | + } |
| 99 | + }); |
| 100 | + } |
63 | 101 | } |
0 commit comments