diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 9dc24f47b68..0d16d0710c2 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -154,6 +154,13 @@ def test_endianness( # as separately resized channel assert_image_equal(ch, references[channels[i]]) + @pytest.mark.parametrize("mode", ("I;16", "I;16L", "I;16B", "I;16N")) + def test_i16(self, mode: str) -> None: + im = Image.new(mode, (1, 2)) + im.putdata((0x0099, 0x0100)) + resized = self.resize(im, (1, 1), Image.Resampling.BICUBIC) + assert resized.getpixel((0, 0)) == 0x00CD + @pytest.mark.parametrize( "resample", ( diff --git a/docs/releasenotes/13.1.0.rst b/docs/releasenotes/13.1.0.rst index 140bcbe3115..5edc0d28693 100644 --- a/docs/releasenotes/13.1.0.rst +++ b/docs/releasenotes/13.1.0.rst @@ -49,6 +49,13 @@ TODO Other changes ============= +Resizing I;16B and I;16N images +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +On little-endian systems, :py:meth:`~PIL.Image.Image.resize` read and wrote +I;16B and I;16N pixel values in the wrong byte order when using a resampling +filter other than ``Resampling.NEAREST``. This has been fixed. + Blurring I;16 images ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index e079a7c8e70..5834ad15457 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -551,9 +551,9 @@ _ImagingResampleHorizontal_16bpc( int bigendian = 0; if ( - imIn->mode == IMAGING_MODE_I_16N + imIn->mode == IMAGING_MODE_I_16B #ifdef WORDS_BIGENDIAN - || imIn->mode == IMAGING_MODE_I_16B + || imIn->mode == IMAGING_MODE_I_16N #endif ) { bigendian = 1; @@ -602,9 +602,9 @@ _ImagingResampleVertical_16bpc( int bigendian = 0; if ( - imIn->mode == IMAGING_MODE_I_16N + imIn->mode == IMAGING_MODE_I_16B #ifdef WORDS_BIGENDIAN - || imIn->mode == IMAGING_MODE_I_16B + || imIn->mode == IMAGING_MODE_I_16N #endif ) { bigendian = 1;