From 4f2a896eff2a0707b494fb8db95fa09b1be9dd19 Mon Sep 17 00:00:00 2001 From: jevans Date: Thu, 13 Nov 2014 13:39:36 -0500 Subject: [PATCH] ignore_pclr_cmap_cdef is now a property --- glymur/jp2k.py | 49 ++++++++++++++++++------------- glymur/test/test_jp2k.py | 9 ++++-- glymur/test/test_opj_suite_2p1.py | 4 +-- glymur/test/test_printing.py | 2 +- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/glymur/jp2k.py b/glymur/jp2k.py index a33d466..f7271dd 100644 --- a/glymur/jp2k.py +++ b/glymur/jp2k.py @@ -60,6 +60,11 @@ class Jp2k(Jp2kBox): List of top-level boxes in the file. Each box may in turn contain its own list of boxes. Will be empty if the file consists only of a raw codestream. + shape : tuple + Size of the image. + ignore_pclr_cmap_cdef : bool + Whether or not to ignore the pclr, cmap, or cdef boxes during any + color transformation. Defaults to False. Examples -------- @@ -95,11 +100,20 @@ class Jp2k(Jp2kBox): self._codec_format = None self._colorspace = None self._shape = None + self._ignore_pclr_cmap_cdef = False # Parse the file for JP2/JPX contents only if we are reading it. if mode == 'rb': self.parse() + @property + def ignore_pclr_cmap_cdef(self): + return self._ignore_pclr_cmap_cdef + + @ignore_pclr_cmap_cdef.setter + def ignore_pclr_cmap_cdef(self, ignore_pclr_cmap_cdef): + self._ignore_pclr_cmap_cdef = ignore_pclr_cmap_cdef + @property def shape(self): if self._shape is not None: @@ -1009,9 +1023,6 @@ class Jp2k(Jp2kBox): (first_row, first_col, last_row, last_col) tile : int, optional Number of tile to decode. - ignore_pclr_cmap_cdef : bool - Whether or not to ignore the pclr, cmap, or cdef boxes during any - color transformation. Defaults to False. verbose : bool, optional Print informational messages produced by the OpenJPEG library. @@ -1025,6 +1036,8 @@ class Jp2k(Jp2kBox): IOError If the image has differing subsample factors. """ + if 'ignore_pclr_cmap_cdef' in kwargs: + self.ignore_pclr_cmap_cdef = kwargs['ignore_pclr_cmap_cdef'] warnings.warn("Use array-style slicing instead.", DeprecationWarning) if version.openjpeg_version_tuple[0] < 2: img = self._read_openjpeg(**kwargs) @@ -1044,8 +1057,7 @@ class Jp2k(Jp2kBox): msg += "the read_bands method instead." raise RuntimeError(msg) - def _read_openjpeg(self, rlevel=0, ignore_pclr_cmap_cdef=False, - verbose=False, area=None): + def _read_openjpeg(self, rlevel=0, verbose=False, area=None): """Read a JPEG 2000 image using libopenjpeg. Parameters @@ -1053,9 +1065,6 @@ class Jp2k(Jp2kBox): rlevel : int, optional Factor by which to rlevel output resolution. Use -1 to get the lowest resolution thumbnail. - ignore_pclr_cmap_cdef : bool - Whether or not to ignore the pclr, cmap, or cdef boxes during any - color transformation. Defaults to False. verbose : bool, optional Print informational messages produced by the OpenJPEG library. area : tuple, optional @@ -1074,7 +1083,7 @@ class Jp2k(Jp2kBox): """ self._subsampling_sanity_check() - self._populate_dparams(rlevel, ignore_pclr_cmap_cdef) + self._populate_dparams(rlevel) with ExitStack() as stack: try: @@ -1127,8 +1136,7 @@ class Jp2k(Jp2kBox): return data - def _read_openjp2(self, rlevel=0, layer=0, area=None, tile=None, - verbose=False, ignore_pclr_cmap_cdef=False): + def _read_openjp2(self, rlevel=0, layer=0, area=None, tile=None, verbose=False): """Read a JPEG 2000 image using libopenjp2. Parameters @@ -1158,8 +1166,7 @@ class Jp2k(Jp2kBox): """ self._subsampling_sanity_check() - self._populate_dparams(rlevel, ignore_pclr_cmap_cdef, - layer=layer, tile=tile, area=area) + self._populate_dparams(rlevel, layer=layer, tile=tile, area=area) with ExitStack() as stack: if re.match("2.1", version.openjpeg_version): @@ -1203,8 +1210,7 @@ class Jp2k(Jp2kBox): return img_array - def _populate_dparams(self, rlevel, ignore_pclr_cmap_cdef, tile=None, - layer=None, area=None): + def _populate_dparams(self, rlevel, tile=None, layer=None, area=None): """Populate decompression structure with appropriate input parameters. Parameters @@ -1218,9 +1224,6 @@ class Jp2k(Jp2kBox): (first_row, first_col, last_row, last_col) tile : int Number of tile to decode. - ignore_pclr_cmap_cdef : bool - Whether or not to ignore the pclr, cmap, or cdef boxes during any - color transformation. Defaults to False. """ if opj2.OPENJP2 is not None: dparam = opj2.set_default_decoder_parameters() @@ -1233,6 +1236,10 @@ class Jp2k(Jp2kBox): infile += b'0' * nelts dparam.infile = infile + if self.ignore_pclr_cmap_cdef: + # Return raw codestream components. + dparam.flags |= 1 + dparam.decod_format = self._codec_format if layer is not None: @@ -1267,7 +1274,7 @@ class Jp2k(Jp2kBox): dparam.tile_index = tile dparam.nb_tile_to_decode = 1 - if ignore_pclr_cmap_cdef is True: + if self.ignore_pclr_cmap_cdef: # Return raw codestream components. dparam.flags |= 1 @@ -1319,8 +1326,8 @@ class Jp2k(Jp2kBox): "OpenJPEG installed before using this " "functionality.") - self._populate_dparams(rlevel, ignore_pclr_cmap_cdef, - layer=layer, tile=tile, area=area) + self.ignore_pclr_cmap_cdef = ignore_pclr_cmap_cdef + self._populate_dparams(rlevel, layer=layer, tile=tile, area=area) with ExitStack() as stack: if re.match("2.1", version.openjpeg_version): diff --git a/glymur/test/test_jp2k.py b/glymur/test/test_jp2k.py index dda8161..f615cc4 100644 --- a/glymur/test/test_jp2k.py +++ b/glymur/test/test_jp2k.py @@ -548,7 +548,8 @@ class TestJp2k(unittest.TestCase): """Indices for pclr jpxfile if no color transform""" j = Jp2k(self.jpxfile) rgb = j[:] - idx = j.read(ignore_pclr_cmap_cdef=True) + j.ignore_pclr_cmap_cdef = True + idx = j[:] nr, nc = 1024, 1024 self.assertEqual(rgb.shape, (nr, nc, 3)) self.assertEqual(idx.shape, (nr, nc)) @@ -1373,7 +1374,8 @@ class TestJp2kOpjDataRoot(unittest.TestCase): with self.assertWarns(UserWarning): jp2 = Jp2k(filename) rgb = jp2[:] - idx = jp2.read(ignore_pclr_cmap_cdef=True) + jp2.ignore_pclr_cmap_cdef = True + idx = jp2[:] self.assertEqual(rgb.shape, (512, 768, 3)) self.assertEqual(idx.shape, (512, 768)) @@ -1407,7 +1409,8 @@ class TestJp2kOpjDataRoot(unittest.TestCase): # The file has a bad compatibility list entry. Not important here. j = Jp2k(filename) ycbcr = j[:] - crcby = j.read(ignore_pclr_cmap_cdef=True) + j.ignore_pclr_cmap_cdef = True + crcby = j[:] expected = np.zeros(ycbcr.shape, ycbcr.dtype) for k in range(crcby.shape[2]): diff --git a/glymur/test/test_opj_suite_2p1.py b/glymur/test/test_opj_suite_2p1.py index addc48b..b151842 100644 --- a/glymur/test/test_opj_suite_2p1.py +++ b/glymur/test/test_opj_suite_2p1.py @@ -134,7 +134,7 @@ class TestSuite2point1(unittest.TestCase): jfile = opj_data_file('input/conformance/p1_04.j2k') jp2k = Jp2k(jfile) tdata = jp2k.read(tile=63, rlevel=2) # last tile - odata = jp2k.read(rlevel=2) + odata = jp2k[::4, ::4] np.testing.assert_array_equal(tdata, odata[224:256, 224:256]) def test_NR_DEC_p1_04_j2k_59_decode(self): @@ -148,7 +148,7 @@ class TestSuite2point1(unittest.TestCase): jfile = opj_data_file('input/conformance/p1_04.j2k') jp2k = Jp2k(jfile) tdata = jp2k.read(tile=12, rlevel=1) # 2nd row, 5th column - odata = jp2k.read(rlevel=1) + odata = jp2k[::2, ::2] np.testing.assert_array_equal(tdata, odata[64:128, 256:320]) @unittest.skipIf(WARNING_INFRASTRUCTURE_ISSUE, WARNING_INFRASTRUCTURE_MSG) diff --git a/glymur/test/test_printing.py b/glymur/test/test_printing.py index 7a5f9b9..5c09c81 100644 --- a/glymur/test/test_printing.py +++ b/glymur/test/test_printing.py @@ -111,7 +111,7 @@ class TestPrinting(unittest.TestCase): """verify printing of asoc, label boxes""" # Construct a fake file with an asoc and a label box, as # OpenJPEG doesn't have such a file. - data = glymur.Jp2k(self.jp2file).read(rlevel=1) + data = glymur.Jp2k(self.jp2file)[::2, ::2] with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: j = glymur.Jp2k(tfile.name, 'wb') j.write(data)