Merge branch 'master' into devel

This commit is contained in:
John Evans 2013-06-03 08:23:52 -04:00
commit acebb078f3
10 changed files with 98 additions and 27 deletions

View file

@ -1,3 +1,7 @@
Jun 02, 2013 - v0.1.3p1 Raising IOErrors when code block size and precinct
sizes are not in harmony. Added statement to docs about upstream library
dependence. Added roadmap to docs.
May 30, 2013 - v0.1.2. Added XMP UUID read support. Added jp2 boxes to rst
docs, XMLBox.indent method made into a private module method. Precinct
sizes restricted to be multiples of two.

View file

@ -1,14 +1,22 @@
# file GENERATED by distutils, do NOT edit
README
setup.py
jptools/__init__.py
jptools/codestream.py
jptools/core.py
jptools/jp2box.py
jptools/jp2k.py
jptools/data/emneck.jp2
jptools/test/__init__.py
jptools/test/test_codestream.py
jptools/test/test_conformance.py
jptools/test/test_jp2k.py
jptools/test/test_printing.py
bin/jp2dump
glymur/__init__.py
glymur/codestream.py
glymur/core.py
glymur/jp2box.py
glymur/jp2dump.py
glymur/jp2k.py
glymur/data/nemo.jp2
glymur/lib/__init__.py
glymur/lib/openjp2.py
glymur/lib/test/__init__.py
glymur/lib/test/test_openjp2.py
glymur/test/__init__.py
glymur/test/test_callbacks.py
glymur/test/test_codestream.py
glymur/test/test_jp2k.py
glymur/test/test_opj_suite.py
glymur/test/test_opj_suite_neg.py
glymur/test/test_opj_suite_write.py
glymur/test/test_printing.py

View file

@ -75,7 +75,7 @@ copyright = u'2013, John Evans'
# The short X.Y version.
version = '0.1'
# The full version, including alpha/beta/rc tags.
release = '0.1.2'
release = '0.1.3p1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View file

@ -14,6 +14,7 @@ Contents:
introduction
api
how_do_i
roadmap
Indices and tables

View file

@ -1,19 +1,23 @@
=========================================
glymur: a Python interface for JPEG 2000
Glymur: a Python interface for JPEG 2000
=========================================
**glymur** contains a Python interface to the OpenJPEG library
**Glymur** contains a Python interface to the OpenJPEG library
which allows linux and mac users to read and write JPEG 2000 files. For more
information about OpenJPEG, please consult http://www.openjpeg.org. glymur
should be considered to be alpha-quality software.
information about OpenJPEG, please consult http://www.openjpeg.org. Glymur
currently relies upon a development version of the OpenJPEG library, and so,
while useable, it is totally at the mercy of any upstream changes
made to the development version of OpenJPEG.
glymur tries to support reading and writing of JP2 and J2C files. Writing
J2C/JP2 files is currently limited to images that can fit in memory, however.
Of particular focus is metadata retrieval, such as XMP packets.
Glymur supports both reading and writing of JPEG 2000 images (part 1). Writing
JPEG 2000 images is currently limited to images that can fit in memory,
however.
There is some very limited support for reading JPX
metadata. For instance, **asoc** and **labl** boxes are recognized, so GMLJP2
metadata can be retrieved from such JPX files.
Of particular focus is retrieval of metadata. Reading XMP UUID
boxes is supported, as the data block consists of XML. There is
some very limited support for reading JPX metadata. For instance,
**asoc** and **labl** boxes are recognized, so GMLJP2 metadata can
be retrieved from such JPX files.
------------
Requirements

9
docs/source/roadmap.rst Normal file
View file

@ -0,0 +1,9 @@
Roadmap
=======
Here's an incomplete list of what I'd like to focus on in the near future.
* continue to monitor upstream changes in the **openjp2** library
* add read support or Exif UUIDs
* investigate using CFFI or cython instead of ctypes to wrap **openjp2**

View file

@ -233,6 +233,11 @@ class Jp2k(Jp2kBox):
msg = "Code block area cannot exceed 4096. "
msg += "Code block height and width must be larger than 4."
raise RuntimeError(msg)
if ((math.log(h, 2) != math.floor(math.log(h, 2)) or
math.log(w, 2) != math.floor(math.log(w, 2)))):
msg = "Bad code block size ({0}, {1}), "
msg += "must be powers of 2."
raise IOError(msg.format(h, w))
cparams.cblockw_init = w
cparams.cblockh_init = h
@ -269,10 +274,16 @@ class Jp2k(Jp2kBox):
if psizes is not None:
for j, (prch, prcw) in enumerate(psizes):
if j == 0 and cbsize is not None:
cblkh, cblkw = cbsize
if cblkh * 2 > prch or cblkw * 2 > prcw:
msg = "Highest Resolution precinct size must be at "
msg += "least twice that of the code block dimensions."
raise IOError(msg)
if ((math.log(prch, 2) != math.floor(math.log(prch, 2)) or
math.log(prcw, 2) != math.floor(math.log(prcw, 2)))):
msg = "Bad precinct size ({0}, {1}), "
msg += "must be multiple of 2."
msg = "Bad precinct sizes ({0}, {1}), "
msg += "must be powers of 2."
raise IOError(msg.format(prch, prcw))
cparams.prcw_init[j] = prcw

View file

@ -150,6 +150,19 @@ class TestJp2k(unittest.TestCase):
subsetdata = j.read(area=(0, 0, 512, 512))
np.testing.assert_array_equal(tiledata, subsetdata)
def test_write_cprl(self):
# Issue 17
j = Jp2k(self.jp2file)
expdata = j.read(reduce=2)
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
ofile = Jp2k(tfile.name, 'wb')
ofile.write(expdata, prog='CPRL')
actdata = ofile.read()
np.testing.assert_array_equal(actdata, expdata)
c = ofile.get_codestream()
self.assertEqual(c.segment[2].SPcod[0], glymur.core.CPRL)
def test_jp2_boxes(self):
# Verify the boxes of a JP2 file.
jp2k = Jp2k(self.jp2file)

View file

@ -153,7 +153,7 @@ class TestSuiteNegative(unittest.TestCase):
j = Jp2k(infile)
def test_precinct_size_not_multiple_of_two(self):
# Seems like precinct size should be a multiple of two.
# Seems like precinct sizes should be powers of two.
ifile = Jp2k(self.jp2file)
data = ifile.read(reduce=3)
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
@ -161,5 +161,26 @@ class TestSuiteNegative(unittest.TestCase):
with self.assertRaises(IOError) as ce:
ofile.write(data, psizes=[(13, 13)])
def test_codeblock_size_not_multiple_of_two(self):
# Seems like code block sizes should be powers of two.
ifile = Jp2k(self.jp2file)
data = ifile.read(reduce=3)
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
ofile = Jp2k(tfile.name, 'wb')
with self.assertRaises(IOError) as ce:
ofile.write(data, cbsize=(13, 12))
def test_codeblock_size_with_precinct_size(self):
# Seems like code block sizes should never exceed half that of
# precinct size.
ifile = Jp2k(self.jp2file)
data = ifile.read(reduce=3)
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
ofile = Jp2k(tfile.name, 'wb')
with self.assertRaises(IOError) as ce:
ofile.write(data,
cbsize=(64, 64),
psizes=[(64, 64)])
if __name__ == "__main__":
unittest.main()

View file

@ -1,7 +1,7 @@
from distutils.core import setup
kwargs = {'name': 'Glymur',
'version': '0.1.2',
'version': '0.1.3p1',
'description': 'Tools for accessing JPEG2000 files',
'long_description': open('README.md').read(),
'author': 'John Evans',