Skip to content

Commit 6197927

Browse files
authored
Merge pull request #317 from melissalinkert/fix-omexml-bigendian
Fix `BigEndian` in `OME/METADATA.ome.xml`
2 parents 016f81c + 13531c7 commit 6197927

4 files changed

Lines changed: 63 additions & 1 deletion

File tree

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,11 @@ by default. This includes calculating the minimum and maximum pixel values for t
363363
We recommend keeping this metadata for maximum compatibility with downstream applications, but it can
364364
be omitted by using the `--no-minmax` option.
365365

366+
Version 0.12.0 and later switches the underlying library that reads and writes Zarr from jzarr to
367+
[zarr-java](https://github.com/zarr-developers/zarr-java). This allows Zarr v2 and Zarr v3 to be
368+
supported with a single library. A consequence of this change is that all data is now written
369+
as little-endian.
370+
366371
Performance
367372
===========
368373

src/main/java/com/glencoesoftware/bioformats2raw/Converter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1607,7 +1607,10 @@ public void convert()
16071607
}
16081608

16091609
for (int s=0; s<meta.getImageCount(); s++) {
1610-
meta.setPixelsBigEndian(true, s);
1610+
// zarr-java writes little-endian data by default
1611+
// easier for downstream tools especially to standardize
1612+
// on one byte ordering
1613+
meta.setPixelsBigEndian(false, s);
16111614

16121615
if (dimensionOrder != null) {
16131616
meta.setPixelsDimensionOrder(dimensionOrder, s);

src/test/java/com/glencoesoftware/bioformats2raw/test/ZarrTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import dev.zarr.zarrjava.utils.Utils;
2828
import dev.zarr.zarrjava.v2.Array;
2929
import dev.zarr.zarrjava.v2.DataType;
30+
import dev.zarr.zarrjava.v2.Endianness;
3031
import dev.zarr.zarrjava.v2.Group;
3132
import dev.zarr.zarrjava.v2.codec.Codec;
3233
import dev.zarr.zarrjava.v2.codec.core.BloscCodec;
@@ -866,13 +867,17 @@ public void testPixelType(String type, DataType dataType) throws Exception {
866867
// Check series dimensions and special pixels
867868
Array series0 = Array.open(store.resolve("0", "0"));
868869
assertEquals(dataType, series0.metadata().dataType);
870+
assertEquals(Endianness.LITTLE, series0.metadata().endianness);
869871
assertArrayEquals(new long[] {1, 1, 1, 512, 512}, series0.metadata().shape);
870872
assertArrayEquals(
871873
new int[] {1, 1, 1, 512, 512}, series0.metadata().chunkShape());
872874
int[] shape = new int[] {1, 1, 1, 512, 512};
873875

874876
int pixelType = FormatTools.pixelTypeFromString(type);
875877
checkSpecialPixels(0, 1, 1, 1, shape, series0, pixelType);
878+
879+
OME ome = getOMEMetadata();
880+
assertFalse(ome.getImage(0).getPixels().getBigEndian());
876881
}
877882

878883
/**

src/test/java/com/glencoesoftware/bioformats2raw/test/ZarrV3Test.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package com.glencoesoftware.bioformats2raw.test;
99

10+
import java.nio.ByteOrder;
1011
import java.nio.file.Files;
1112
import java.util.Arrays;
1213
import java.util.List;
@@ -18,13 +19,16 @@
1819
import dev.zarr.zarrjava.core.Attributes;
1920
import dev.zarr.zarrjava.v3.Array;
2021
import dev.zarr.zarrjava.v3.ArrayMetadata;
22+
import dev.zarr.zarrjava.v3.DataType;
2123
import dev.zarr.zarrjava.v3.Group;
2224
import dev.zarr.zarrjava.v3.codec.Codec;
2325
import dev.zarr.zarrjava.v3.codec.core.BloscCodec;
26+
import dev.zarr.zarrjava.v3.codec.core.BytesCodec;
2427
import dev.zarr.zarrjava.v3.codec.core.GzipCodec;
2528
import dev.zarr.zarrjava.v3.codec.core.ShardingIndexedCodec;
2629
import dev.zarr.zarrjava.v3.codec.core.ZstdCodec;
2730

31+
import loci.formats.FormatTools;
2832
import ome.xml.model.OME;
2933

3034
import picocli.CommandLine.ExecutionException;
@@ -454,4 +458,49 @@ public void testBadCompressionOptions(String codec) throws Exception {
454458
});
455459
}
456460

461+
/**
462+
* Test pixel type preservation.
463+
*
464+
* @param type string representation of Bio-Formats pixel type
465+
* @param dataType expected corresponding Zarr data type
466+
*/
467+
@ParameterizedTest
468+
@MethodSource("getPixelTypes")
469+
public void testPixelType(String type, DataType dataType) throws Exception {
470+
input = fake("pixelType", type);
471+
assertTool("--ngff-version", getNGFFVersion());
472+
Group z = Group.open(store.resolve(""));
473+
474+
// Check series dimensions and special pixels
475+
Array series0 = Array.open(store.resolve("0", "0"));
476+
assertEquals(dataType, series0.metadata().dataType);
477+
for (Codec codec : series0.metadata().codecs) {
478+
if (codec instanceof BytesCodec) {
479+
assertEquals(((BytesCodec) codec).configuration.endian.getByteOrder(),
480+
ByteOrder.LITTLE_ENDIAN);
481+
}
482+
}
483+
assertArrayEquals(new long[] {1, 1, 1, 512, 512}, series0.metadata().shape);
484+
int[] shape = new int[] {1, 1, 1, 512, 512};
485+
assertArrayEquals(shape, series0.metadata().chunkShape());
486+
487+
int pixelType = FormatTools.pixelTypeFromString(type);
488+
checkSpecialPixels(0, 1, 1, 1, shape, series0, pixelType);
489+
490+
OME ome = getOMEMetadata();
491+
assertFalse(ome.getImage(0).getPixels().getBigEndian());
492+
}
493+
494+
/**
495+
* @return pairs of pixel type strings and Zarr data types
496+
*/
497+
static Stream<Arguments> getPixelTypes() {
498+
return Stream.of(
499+
Arguments.of("float", DataType.FLOAT32),
500+
Arguments.of("double", DataType.FLOAT64),
501+
Arguments.of("uint32", DataType.UINT32),
502+
Arguments.of("int32", DataType.INT32)
503+
);
504+
}
505+
457506
}

0 commit comments

Comments
 (0)