From 61397de88b69de514add818dedaed142345b5b44 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 16 Nov 2018 23:31:42 +1100 Subject: [PATCH] Check quality_layers type --- Tests/test_file_jpeg2k.py | 16 ++++++++++++++++ src/PIL/Jpeg2KImagePlugin.py | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index be49c99bf..8f027b651 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -105,6 +105,22 @@ class TestFileJpeg2k(PillowTestCase): 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 + ]: + test_card.save(outfile, quality_layers=quality_layers) + + for quality_layers in [ + 'quality_layers', + ('100', '50', '10') + ]: + self.assertRaises(ValueError, test_card.save, outfile, + quality_layers=quality_layers) + def test_layers(self): out = BytesIO() test_card.save(out, 'JPEG2000', quality_layers=[100, 50, 10], diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 7659b6bf1..2bf519896 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -232,6 +232,13 @@ def _save(im, fp, filename): tile_size = info.get('tile_size', None) quality_mode = info.get('quality_mode', 'rates') quality_layers = info.get('quality_layers', None) + if quality_layers is not None and not ( + isinstance(quality_layers, (list, tuple)) and + all([isinstance(quality_layer, (int, float)) + for quality_layer in quality_layers]) + ): + raise ValueError('quality_layers must be a sequence of numbers') + num_resolutions = info.get('num_resolutions', 0) cblk_size = info.get('codeblock_size', None) precinct_size = info.get('precinct_size', None)