diff --git a/data/test_files/sm_image_jpegls.dcm b/data/test_files/sm_image_jpegls.dcm new file mode 100644 index 00000000..41b2f415 Binary files /dev/null and b/data/test_files/sm_image_jpegls.dcm differ diff --git a/data/test_files/sm_image_jpegls_nobot.dcm b/data/test_files/sm_image_jpegls_nobot.dcm new file mode 100644 index 00000000..7baadc12 Binary files /dev/null and b/data/test_files/sm_image_jpegls_nobot.dcm differ diff --git a/src/highdicom/io.py b/src/highdicom/io.py index 1bccfdef..521d58b5 100644 --- a/src/highdicom/io.py +++ b/src/highdicom/io.py @@ -185,7 +185,7 @@ def _build_bot(fp: DicomFileLike, number_of_frames: int) -> List[int]: f'Length of Frame item #{i} is zero.' ) - first_two_bytes = fp.read(2, True) + first_two_bytes = fp.read(2) if not fp.is_little_endian: first_two_bytes = first_two_bytes[::-1] # In case of fragmentation, we only want to get the offsets to the diff --git a/tests/test_io.py b/tests/test_io.py index 07d2504c..838152a3 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -73,6 +73,26 @@ def test_read_multi_frame_sm_image_native(self): ) np.testing.assert_array_equal(frame, pixel_array[i, ...]) + def test_read_multi_frame_sm_image_jpegls(self): + filename = str(self._test_dir.joinpath('sm_image_jpegls.dcm')) + dataset = dcmread(filename) + pixel_array = dataset.pixel_array + with ImageFileReader(filename) as reader: + assert reader.number_of_frames == 25 + indices = list(range(reader.number_of_frames)) + shuffle(indices) + for i in indices: + frame = reader.read_frame(i, correct_color=False) + assert isinstance(frame, np.ndarray) + assert frame.ndim == 3 + assert frame.dtype == np.uint8 + assert frame.shape == ( + reader.metadata.Rows, + reader.metadata.Columns, + reader.metadata.SamplesPerPixel, + ) + np.testing.assert_array_equal(frame, pixel_array[i, ...]) + def test_read_multi_frame_sm_image_numbers_native(self): filename = str(self._test_dir.joinpath('sm_image_numbers.dcm')) dataset = dcmread(filename) @@ -212,3 +232,87 @@ def test_read_single_frame_ct_image_dicom_file_like_opened(self): reader.metadata.Columns, ) np.testing.assert_array_equal(frame, pixel_array) + + def test_read_single_frame_sm_image_jpegls_dicom_bytes_io(self): + filename = str(self._test_dir.joinpath("sm_image_jpegls.dcm")) + dcm = DicomBytesIO(open(filename, "rb").read()) + + dataset = dcmread(filename) + pixel_array = dataset.pixel_array + with ImageFileReader(dcm) as reader: + assert reader.number_of_frames == 25 + for fno in range(reader.number_of_frames): + frame = reader.read_frame(fno) + assert isinstance(frame, np.ndarray) + assert frame.ndim == 3 + assert frame.dtype == np.uint8 + assert frame.shape == ( + reader.metadata.Rows, + reader.metadata.Columns, + 3, + ) + np.testing.assert_array_equal(frame, pixel_array[fno]) + + def test_read_single_frame_sm_image_jpegls_nobot_dicom_bytes_io(self): + filename = str(self._test_dir.joinpath("sm_image_jpegls_nobot.dcm")) + dcm = DicomBytesIO(open(filename, "rb").read()) + + dataset = dcmread(filename) + pixel_array = dataset.pixel_array + with ImageFileReader(dcm) as reader: + assert reader.number_of_frames == 25 + for fno in range(reader.number_of_frames): + frame = reader.read_frame(fno) + assert isinstance(frame, np.ndarray) + assert frame.ndim == 3 + assert frame.dtype == np.uint8 + assert frame.shape == ( + reader.metadata.Rows, + reader.metadata.Columns, + 3, + ) + np.testing.assert_array_equal(frame, pixel_array[fno]) + + def test_read_single_frame_sm_image_jpegls_dicom_file_like_opened(self): + # Test reading frames from an opened DicomFileLike file + filename = self._test_dir.joinpath("sm_image_jpegls.dcm") + dcm = DicomFileLike(filename.open("rb")) + + dataset = dcmread(filename) + pixel_array = dataset.pixel_array + with ImageFileReader(dcm) as reader: + assert reader.number_of_frames == 25 + for fno in range(reader.number_of_frames): + frame = reader.read_frame(fno) + assert isinstance(frame, np.ndarray) + assert frame.ndim == 3 + assert frame.dtype == np.uint8 + assert frame.shape == ( + reader.metadata.Rows, + reader.metadata.Columns, + 3, + ) + np.testing.assert_array_equal(frame, pixel_array[fno]) + + def test_read_single_frame_sm_image_jpegls_nobot_dicom_file_like_opened( + self + ): + # Test reading frames from an opened DicomFileLike file + filename = self._test_dir.joinpath("sm_image_jpegls_nobot.dcm") + dcm = DicomFileLike(filename.open("rb")) + + dataset = dcmread(filename) + pixel_array = dataset.pixel_array + with ImageFileReader(dcm) as reader: + assert reader.number_of_frames == 25 + for fno in range(reader.number_of_frames): + frame = reader.read_frame(fno) + assert isinstance(frame, np.ndarray) + assert frame.ndim == 3 + assert frame.dtype == np.uint8 + assert frame.shape == ( + reader.metadata.Rows, + reader.metadata.Columns, + 3, + ) + np.testing.assert_array_equal(frame, pixel_array[fno])