From e4a0d3f8ed3513e2a386bd6386303d2497378667 Mon Sep 17 00:00:00 2001 From: Sam Gerber <95931209+sgerber-hf@users.noreply.github.com> Date: Thu, 21 Nov 2024 05:51:17 -0500 Subject: [PATCH] [utils] Support MetaImage files with unspecified HeaderSize (#149) --- src/deepali/utils/imageio/meta.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/deepali/utils/imageio/meta.py b/src/deepali/utils/imageio/meta.py index 68df4a4..6b99ba5 100644 --- a/src/deepali/utils/imageio/meta.py +++ b/src/deepali/utils/imageio/meta.py @@ -218,12 +218,13 @@ def read_meta_image_from_fileobj(f: io.BufferedReader) -> Tuple[np.ndarray, Meta "ElementDataFile", ): meta[key] = value + elif key == "HeaderSize": + meta[key] = np.intp(value) elif key in ( "NDims", "ID", "ParentID", "CompressedDataSize", - "HeaderSize", "HeaderSizePerSlice", "ElementNumberOfChannels", ): @@ -268,8 +269,18 @@ def read_meta_image_from_fileobj(f: io.BufferedReader) -> Tuple[np.ndarray, Meta element_size = np.dtype(meta["ElementType"]).itemsize increment = np.prod(shape[1:], dtype=int) * element_size - f.seek(meta_size, 0) - f.seek((meta.get("HeaderSize") or 0), 1) + header_size = int( meta.get("HeaderSize") or 0 ) + if header_size == -1: + #See https://github.com/Kitware/MetaIO/blob/1a031fd8223c4846e2f90f50216cbcb415d52018/src/metaImage.cxx#L2601 for reference + data_quantity = int(np.prod(meta["DimSize"])) #type: ignore + element_size = int(np.dtype(meta["ElementType"]).itemsize) + read_size = data_quantity * int(meta["ElementNumberOfChannels"]) * element_size #type: ignore + f.seek(-read_size, 2) + elif header_size >= 0: + f.seek(meta_size + header_size, 0) + else: + raise ValueError(f"Invalid HeaderSize {header_size}") + if meta.get("CompressedData"): if meta["CompressedDataSize"] is None: raise ValueError("CompressedDataSize needs to be specified when using CompressedData")