Skip to content

Commit eeff002

Browse files
authored
Merge pull request #314 from ImagingDataCommons/bug/get_bot_pydicom3
Fix for BOT construction, add test
2 parents edf89e6 + 503d0ea commit eeff002

4 files changed

Lines changed: 105 additions & 1 deletion

File tree

11.1 KB
Binary file not shown.
11 KB
Binary file not shown.

src/highdicom/io.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def _build_bot(fp: DicomFileLike, number_of_frames: int) -> List[int]:
185185
f'Length of Frame item #{i} is zero.'
186186
)
187187

188-
first_two_bytes = fp.read(2, True)
188+
first_two_bytes = fp.read(2)
189189
if not fp.is_little_endian:
190190
first_two_bytes = first_two_bytes[::-1]
191191
# In case of fragmentation, we only want to get the offsets to the

tests/test_io.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,26 @@ def test_read_multi_frame_sm_image_native(self):
7373
)
7474
np.testing.assert_array_equal(frame, pixel_array[i, ...])
7575

76+
def test_read_multi_frame_sm_image_jpegls(self):
77+
filename = str(self._test_dir.joinpath('sm_image_jpegls.dcm'))
78+
dataset = dcmread(filename)
79+
pixel_array = dataset.pixel_array
80+
with ImageFileReader(filename) as reader:
81+
assert reader.number_of_frames == 25
82+
indices = list(range(reader.number_of_frames))
83+
shuffle(indices)
84+
for i in indices:
85+
frame = reader.read_frame(i, correct_color=False)
86+
assert isinstance(frame, np.ndarray)
87+
assert frame.ndim == 3
88+
assert frame.dtype == np.uint8
89+
assert frame.shape == (
90+
reader.metadata.Rows,
91+
reader.metadata.Columns,
92+
reader.metadata.SamplesPerPixel,
93+
)
94+
np.testing.assert_array_equal(frame, pixel_array[i, ...])
95+
7696
def test_read_multi_frame_sm_image_numbers_native(self):
7797
filename = str(self._test_dir.joinpath('sm_image_numbers.dcm'))
7898
dataset = dcmread(filename)
@@ -212,3 +232,87 @@ def test_read_single_frame_ct_image_dicom_file_like_opened(self):
212232
reader.metadata.Columns,
213233
)
214234
np.testing.assert_array_equal(frame, pixel_array)
235+
236+
def test_read_single_frame_sm_image_jpegls_dicom_bytes_io(self):
237+
filename = str(self._test_dir.joinpath("sm_image_jpegls.dcm"))
238+
dcm = DicomBytesIO(open(filename, "rb").read())
239+
240+
dataset = dcmread(filename)
241+
pixel_array = dataset.pixel_array
242+
with ImageFileReader(dcm) as reader:
243+
assert reader.number_of_frames == 25
244+
for fno in range(reader.number_of_frames):
245+
frame = reader.read_frame(fno)
246+
assert isinstance(frame, np.ndarray)
247+
assert frame.ndim == 3
248+
assert frame.dtype == np.uint8
249+
assert frame.shape == (
250+
reader.metadata.Rows,
251+
reader.metadata.Columns,
252+
3,
253+
)
254+
np.testing.assert_array_equal(frame, pixel_array[fno])
255+
256+
def test_read_single_frame_sm_image_jpegls_nobot_dicom_bytes_io(self):
257+
filename = str(self._test_dir.joinpath("sm_image_jpegls_nobot.dcm"))
258+
dcm = DicomBytesIO(open(filename, "rb").read())
259+
260+
dataset = dcmread(filename)
261+
pixel_array = dataset.pixel_array
262+
with ImageFileReader(dcm) as reader:
263+
assert reader.number_of_frames == 25
264+
for fno in range(reader.number_of_frames):
265+
frame = reader.read_frame(fno)
266+
assert isinstance(frame, np.ndarray)
267+
assert frame.ndim == 3
268+
assert frame.dtype == np.uint8
269+
assert frame.shape == (
270+
reader.metadata.Rows,
271+
reader.metadata.Columns,
272+
3,
273+
)
274+
np.testing.assert_array_equal(frame, pixel_array[fno])
275+
276+
def test_read_single_frame_sm_image_jpegls_dicom_file_like_opened(self):
277+
# Test reading frames from an opened DicomFileLike file
278+
filename = self._test_dir.joinpath("sm_image_jpegls.dcm")
279+
dcm = DicomFileLike(filename.open("rb"))
280+
281+
dataset = dcmread(filename)
282+
pixel_array = dataset.pixel_array
283+
with ImageFileReader(dcm) as reader:
284+
assert reader.number_of_frames == 25
285+
for fno in range(reader.number_of_frames):
286+
frame = reader.read_frame(fno)
287+
assert isinstance(frame, np.ndarray)
288+
assert frame.ndim == 3
289+
assert frame.dtype == np.uint8
290+
assert frame.shape == (
291+
reader.metadata.Rows,
292+
reader.metadata.Columns,
293+
3,
294+
)
295+
np.testing.assert_array_equal(frame, pixel_array[fno])
296+
297+
def test_read_single_frame_sm_image_jpegls_nobot_dicom_file_like_opened(
298+
self
299+
):
300+
# Test reading frames from an opened DicomFileLike file
301+
filename = self._test_dir.joinpath("sm_image_jpegls_nobot.dcm")
302+
dcm = DicomFileLike(filename.open("rb"))
303+
304+
dataset = dcmread(filename)
305+
pixel_array = dataset.pixel_array
306+
with ImageFileReader(dcm) as reader:
307+
assert reader.number_of_frames == 25
308+
for fno in range(reader.number_of_frames):
309+
frame = reader.read_frame(fno)
310+
assert isinstance(frame, np.ndarray)
311+
assert frame.ndim == 3
312+
assert frame.dtype == np.uint8
313+
assert frame.shape == (
314+
reader.metadata.Rows,
315+
reader.metadata.Columns,
316+
3,
317+
)
318+
np.testing.assert_array_equal(frame, pixel_array[fno])

0 commit comments

Comments
 (0)