ignore_pclr_cmap_cdef is now a property
This commit is contained in:
parent
82a9edae62
commit
4f2a896eff
4 changed files with 37 additions and 27 deletions
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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]):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue