diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 339b54c467e..a4db2ea9b7a 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -119,6 +119,12 @@ def test_reduce(self): im.load() assert im.size == (160, 120) + def test_load_reduce(self): + with Image.open("Tests/images/test-card-lossless.jp2") as im: + im.load_reduce = 2 + im.load() + self.assertEqual(im.size, (160, 120)) + def test_layers_type(self): outfile = self.tempfile("temp_layers.jp2") for quality_layers in [[100, 50, 10], (100, 50, 10), None]: diff --git a/Tests/test_image_reduce.py b/Tests/test_image_reduce.py index b41ae919bae..c1e12e18fc0 100644 --- a/Tests/test_image_reduce.py +++ b/Tests/test_image_reduce.py @@ -3,6 +3,8 @@ from .helper import PillowTestCase, convert_to_comparable +codecs = dir(Image.core) + class TestImageReduce(PillowTestCase): # There are several internal implementations @@ -236,3 +238,8 @@ def test_mode_F(self): for factor in self.remarkable_factors: self.compare_reduce_with_reference(im, factor, 0, 0) self.compare_reduce_with_box(im, factor) + + @pytest.mark.skipif("jpeg2k_decoder" not in codecs, reason="JPEG 2000 support not available") + def test_jpeg2k(self): + with Image.open("Tests/images/test-card-lossless.jp2") as im: + self.assertEqual(im.reduce(2).size, (320, 240)) diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 2c51d36780a..4714d6e2df7 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -176,7 +176,7 @@ def _open(self): if self.size is None or self.mode is None: raise SyntaxError("unable to determine size/mode") - self.reduce = 0 + self.load_reduce = 0 self.layers = 0 fd = -1 @@ -200,13 +200,14 @@ def _open(self): "jpeg2k", (0, 0) + self.size, 0, - (self.codec, self.reduce, self.layers, fd, length), + (self.codec, self.load_reduce, self.layers, fd, length), ) ] def load(self): - if self.reduce: - power = 1 << self.reduce + reduce = self.reduce if not callable(self.reduce) else self.load_reduce + if reduce: + power = 1 << reduce adjust = power >> 1 self._size = ( int((self.size[0] + adjust) / power), @@ -216,7 +217,7 @@ def load(self): if self.tile: # Update the reduce and layers settings t = self.tile[0] - t3 = (t[3][0], self.reduce, self.layers, t[3][3], t[3][4]) + t3 = (t[3][0], reduce, self.layers, t[3][3], t[3][4]) self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] return ImageFile.ImageFile.load(self)