Skip to content

Commit e4a0d3f

Browse files
authored
[utils] Support MetaImage files with unspecified HeaderSize (#149)
1 parent 6982927 commit e4a0d3f

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/deepali/utils/imageio/meta.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,13 @@ def read_meta_image_from_fileobj(f: io.BufferedReader) -> Tuple[np.ndarray, Meta
218218
"ElementDataFile",
219219
):
220220
meta[key] = value
221+
elif key == "HeaderSize":
222+
meta[key] = np.intp(value)
221223
elif key in (
222224
"NDims",
223225
"ID",
224226
"ParentID",
225227
"CompressedDataSize",
226-
"HeaderSize",
227228
"HeaderSizePerSlice",
228229
"ElementNumberOfChannels",
229230
):
@@ -268,8 +269,18 @@ def read_meta_image_from_fileobj(f: io.BufferedReader) -> Tuple[np.ndarray, Meta
268269
element_size = np.dtype(meta["ElementType"]).itemsize
269270
increment = np.prod(shape[1:], dtype=int) * element_size
270271

271-
f.seek(meta_size, 0)
272-
f.seek((meta.get("HeaderSize") or 0), 1)
272+
header_size = int( meta.get("HeaderSize") or 0 )
273+
if header_size == -1:
274+
#See https://github.com/Kitware/MetaIO/blob/1a031fd8223c4846e2f90f50216cbcb415d52018/src/metaImage.cxx#L2601 for reference
275+
data_quantity = int(np.prod(meta["DimSize"])) #type: ignore
276+
element_size = int(np.dtype(meta["ElementType"]).itemsize)
277+
read_size = data_quantity * int(meta["ElementNumberOfChannels"]) * element_size #type: ignore
278+
f.seek(-read_size, 2)
279+
elif header_size >= 0:
280+
f.seek(meta_size + header_size, 0)
281+
else:
282+
raise ValueError(f"Invalid HeaderSize {header_size}")
283+
273284
if meta.get("CompressedData"):
274285
if meta["CompressedDataSize"] is None:
275286
raise ValueError("CompressedDataSize needs to be specified when using CompressedData")

0 commit comments

Comments
 (0)