From 373afb692e3f90a2f5896f3edfd372e0c659eb41 Mon Sep 17 00:00:00 2001 From: jevans Date: Tue, 18 Nov 2014 20:45:25 -0500 Subject: [PATCH] progress --- glymur/jp2k.py | 29 +++++++++++++++++++++++++---- glymur/test/test_callbacks.py | 25 +++++++++++++++++++++---- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/glymur/jp2k.py b/glymur/jp2k.py index a45f9e2..8d8ffd4 100644 --- a/glymur/jp2k.py +++ b/glymur/jp2k.py @@ -62,9 +62,15 @@ class Jp2k(Jp2kBox): raw codestream. shape : tuple Size of the image. + + Properties + ---------- ignore_pclr_cmap_cdef : bool - Whether or not to ignore the pclr, cmap, or cdef boxes during any - color transformation. Defaults to False. + whether or not to ignore the pclr, cmap, or cdef boxes during any + color transformation, defaults to False. + verbose : bool + whether or not to print informational messages produced by the + OpenJPEG library, defaults to false Examples -------- @@ -100,7 +106,9 @@ class Jp2k(Jp2kBox): self._codec_format = None self._colorspace = None self._shape = None + self._ignore_pclr_cmap_cdef = False + self._verbose = False # Parse the file for JP2/JPX contents only if we are reading it. if mode == 'rb': @@ -114,6 +122,14 @@ class Jp2k(Jp2kBox): def ignore_pclr_cmap_cdef(self, ignore_pclr_cmap_cdef): self._ignore_pclr_cmap_cdef = ignore_pclr_cmap_cdef + @property + def verbose(self): + return self._verbose + + @verbose.setter + def verbose(self, verbose): + self._verbose = verbose + @property def shape(self): if self._shape is not None: @@ -671,7 +687,11 @@ class Jp2k(Jp2kBox): codec = opj2.create_compress(self._cparams.codec_fmt) stack.callback(opj2.destroy_codec, codec) - info_handler = _INFO_CALLBACK if verbose else None + if self._verbose or verbose: + info_handler = _INFO_CALLBACK + else: + info_handler = None + opj2.set_info_handler(codec, info_handler) opj2.set_warning_handler(codec, _WARNING_CALLBACK) opj2.set_error_handler(codec, _ERROR_CALLBACK) @@ -1183,7 +1203,8 @@ class Jp2k(Jp2kBox): opj2.set_error_handler(codec, _ERROR_CALLBACK) opj2.set_warning_handler(codec, _WARNING_CALLBACK) - if verbose: + + if self._verbose or verbose: opj2.set_info_handler(codec, _INFO_CALLBACK) else: opj2.set_info_handler(codec, None) diff --git a/glymur/test/test_callbacks.py b/glymur/test/test_callbacks.py index ce3bb8c..a58cfeb 100644 --- a/glymur/test/test_callbacks.py +++ b/glymur/test/test_callbacks.py @@ -39,7 +39,7 @@ class TestCallbacks(unittest.TestCase): "Missing openjp2 library.") @unittest.skipIf(WARNING_INFRASTRUCTURE_ISSUE, WARNING_INFRASTRUCTURE_MSG) @unittest.skipIf(os.name == "nt", "Temporary file issue on window.") - def test_info_callback_on_write(self): + def test_info_callback_on_write_backwards_compatibility(self): """Verify messages printed when writing an image in verbose mode.""" j = glymur.Jp2k(self.jp2file) with self.assertWarns(UserWarning): @@ -52,20 +52,37 @@ class TestCallbacks(unittest.TestCase): expected = '[INFO] tile number 1 / 1' self.assertEqual(actual, expected) + @unittest.skipIf(glymur.version.openjpeg_version[0] != '2', + "Missing openjp2 library.") + @unittest.skipIf(os.name == "nt", "Temporary file issue on window.") + def test_info_callback_on_write(self): + """Verify messages printed when writing an image in verbose mode.""" + j = glymur.Jp2k(self.jp2file) + tiledata = j[:] + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + jp2 = glymur.Jp2k(tfile.name, 'wb') + with patch('sys.stdout', new=StringIO()) as fake_out: + jp2.verbose = True + jp2[:] = tiledata + actual = fake_out.getvalue().strip() + expected = '[INFO] tile number 1 / 1' + self.assertEqual(actual, expected) + def test_info_callbacks_on_read(self): """stdio output when info callback handler is enabled""" # Verify that we get the expected stdio output when our internal info # callback handler is enabled. - j = glymur.Jp2k(self.j2kfile) + jp2 = glymur.Jp2k(self.j2kfile) with patch('sys.stdout', new=StringIO()) as fake_out: - j.read(rlevel=1, verbose=True) + jp2.verbose = True + jp2[::2, ::2] actual = fake_out.getvalue().strip() if glymur.version.openjpeg_version[0] == '2': lines = ['[INFO] Start to read j2k main header (0).', '[INFO] Main header has been correctly decoded.', - '[INFO] No decoded area parameters, set the decoded area to the whole image', + '[INFO] Setting decoding area to 0,0,480,800', '[INFO] Header of tile 0 / 0 has been read.', '[INFO] Tile 1/1 has been decoded.', '[INFO] Image data has been updated with tile 1.']