Compare commits

...
Sign in to create a new pull request.

8 commits

Author SHA1 Message Date
John Evans
14af46abeb bumping to 0.7.0rc2 2014-09-29 14:20:42 -04:00
jevans
83eaded778 added mention of testing on windows 2014-09-29 07:42:50 -04:00
jevans
760da6bade better error message if array-style slice other than [:] 2014-09-29 07:37:17 -04:00
John Evans
1b0f60298d skip test on windows
uses namedtemporaryfile
2014-09-28 12:44:55 -04:00
John Evans
56042efd98 use round rather than floor 2014-09-28 12:43:57 -04:00
John Evans
1341a15f7b force step=>rlevel computation to result in integer
For whatever stupid reason, np.log2(x) cannot be relied upon to be an
integer when x is a power of 2 ON WIN32!!!  All hail win32!
2014-09-26 16:00:42 -04:00
John Evans
e2661ee7f4 doc mods 2014-09-25 19:33:03 -04:00
jevans
fc2519ca75 more doc updates 2014-09-25 18:57:13 -04:00
9 changed files with 46 additions and 24 deletions

View file

@ -1,6 +1,7 @@
Sep 25, 2014 - -v0.7.0 Added __getitem__, __setitem__ support. Sep 25, 2014 - -v0.7.0 Added __getitem__, __setitem__ support. Changed jp2dump
into a console script.
Mar 06, 2014 - Added Cinema2K, Cinema4K write support. Mar 06, 2014 - v0.6.0 - Added Cinema2K, Cinema4K write support.
Changed constructor for ChannelDefinition box. Removed support Changed constructor for ChannelDefinition box. Removed support
for Python 2.6. Added write support for JP2 UUID, DataEntryURL, for Python 2.6. Added write support for JP2 UUID, DataEntryURL,
Palette and Component Mapping boxes, JPX Association, NumberList Palette and Component Mapping boxes, JPX Association, NumberList

View file

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

View file

@ -24,11 +24,11 @@ configuration format is the same as used by Python’s configparser
module, i.e. :: module, i.e. ::
[library] [library]
openjp2: /opt/openjp2-svn/lib/libopenjp2.so openjp2: /somewhere/lib/libopenjp2.so
This assumes, of course, that you've installed OpenJPEG into This assumes, of course, that you've installed OpenJPEG into
/opt/openjp2-svn on a linux system. The location of the configuration file /opt/openjpeg on a linux system. The location of the configuration file
can vary as well (of course). If you use either linux or mac, the path can vary as well. If you use either linux or mac, the path
to the configuration file would normally be :: to the configuration file would normally be ::
$HOME/.config/glymur/glymurrc $HOME/.config/glymur/glymurrc
@ -48,7 +48,7 @@ You may also include a line for the version 1.x openjpeg library if you have it
installed in a non-standard place, i.e. :: installed in a non-standard place, i.e. ::
[library] [library]
openjpeg: /not/the/usual/location/lib/libopenjpeg.so openjpeg: /somewhere/lib/libopenjpeg.so
''''''' '''''''
Testing Testing

View file

@ -7,11 +7,11 @@ How do I...?
================ ================
Jp2k implements slicing via the :py:meth:`__getitem__` method, meaning that Jp2k implements slicing via the :py:meth:`__getitem__` method, meaning that
multiple resolution imagery in a JPEG 2000 file can multiple resolution imagery in a JPEG 2000 file can
easily be accessed. For example here's how to retrieve a full resolution and easily be accessed via array-style slicing. For example here's how to
first lower-resolution image :: retrieve a full resolution and first lower-resolution image ::
>>> import glymur >>> import glymur
>>> jp2file = glymur.data.nemo() >>> jp2file = glymur.data.nemo() # just a path to a JPEG2000 file
>>> jp2 = glymur.Jp2k(jp2file) >>> jp2 = glymur.Jp2k(jp2file)
>>> fullres = jp2[:] >>> fullres = jp2[:]
>>> print(fullres.shape) >>> print(fullres.shape)
@ -20,8 +20,21 @@ first lower-resolution image ::
>>> print(thumbnail.shape) >>> print(thumbnail.shape)
(728, 1296, 3) (728, 1296, 3)
The :py:meth:`read` method gives many more options for other JPEG 2000 features The :py:meth:`read` method exposes many more options for other JPEG 2000
such as quality layers. features such as quality layers.
... write images?
=================
So long as the image data can fit entirely into memory, array-style slicing may
also be used to write JPEG 2000 files.
>>> import glymur, numpy as np
>>> jp2 = glymur.Jp2k('zeros.jp2', mode='wb')
>>> jp2[:] = np.zeros((640, 480), dtype=np.uint8)
The :py:meth:`write` method exposes many more options for other JPEG 2000
features. You should have OpenJPEG version 1.5 or more recent before writing
JPEG 2000 images.
... display metadata? ... display metadata?
===================== =====================
@ -328,10 +341,10 @@ is currently limited to XML and UUID boxes.
... create an image with an alpha layer? ... create an image with an alpha layer?
======================================== ========================================
OpenJPEG can create JP2 files with more than 3 components (requires OpenJPEG can create JP2 files with more than 3 components (use version 2.1.0+
the development version of OpenJPEG), but by default, any extra components are for this), but by default, any extra components are not described
not described as such. In order to do so, we need to rewrap such as such. In order to do so, we need to rewrap such an image in a
an image in a set of boxes that includes a channel definition box. set of boxes that includes a channel definition box.
This example is based on SciPy example code found at This example is based on SciPy example code found at
http://scipy-lectures.github.io/advanced/image_processing/#basic-manipulations . http://scipy-lectures.github.io/advanced/image_processing/#basic-manipulations .
@ -389,7 +402,11 @@ Here's how the Preview application on the mac shows the RGBA image.
... work with XMP UUIDs? ... work with XMP UUIDs?
======================== ========================
XMP is metadata on steroids. `Wikipedia <http://en.wikipedia.org/wiki/Extensible_Metadata_Platform>`_ states
that "The Extensible Metadata Platform (XMP) is an ISO standard,
originally created by Adobe Systems Inc., for the creation, processing
and interchange of standardized and custom metadata for all kinds
of resources."
The example JP2 file shipped with glymur has an XMP UUID. :: The example JP2 file shipped with glymur has an XMP UUID. ::

View file

@ -10,12 +10,11 @@ JPEG 2000 images is currently limited to images that can fit in memory.
but it is strongly recommended to use version 2.1.0, which is the most recently but it is strongly recommended to use version 2.1.0, which is the most recently
released version of OpenJPEG at this time. released version of OpenJPEG at this time.
In regards to metadata, most JP2 boxes are properly interpreted. In regards to metadata, most JP2 boxes are properly interpreted.
Certain optional JP2 boxes can also be written, including XML boxes and Certain optional JP2 boxes can also be written, including XML boxes and
XMP UUIDs. There is incomplete support for reading JPX metadata. XMP UUIDs. There is incomplete support for reading JPX metadata.
Glymur 0.6 works on Python versions 2.7, 3.3 and 3.4. If you have Python 2.6, Glymur works on Python versions 2.7, 3.3 and 3.4. If you have Python 2.6,
you should use the 0.5 series of Glymur. you should use the 0.5 series of Glymur.
For more information about OpenJPEG, please consult http://www.openjpeg.org. For more information about OpenJPEG, please consult http://www.openjpeg.org.

View file

@ -2,8 +2,10 @@
Platforms Tested (0.7.0 release only) Platforms Tested (0.7.0 release only)
------------------------------------- -------------------------------------
* Linux Mint 17 / Python 3.4.0 and 2.7.6 / OpenJPEG 2.1.0 and 1.3.0 * Linux Mint 17 / Python 3.4.0 and 2.7.6 / OpenJPEG 2.1.0 and 1.3.0
* MacOS 10.6.8 / MacPorts / Python 3.4.1 * MacOS 10.6.8 / MacPorts Python 3.4.1, 3.3.5,and 2.7.8 / OpenJPEG 2.1.0
* CentOS 6.5 / Anaconda Python 3.4.1 / OpenJPEG 1.3.0 * CentOS 6.5 / Anaconda Python 3.4.1 / OpenJPEG 1.3.0
* Fedora 20 i386 / Python 2.7.5 and 3.3.2 / OpenJPEG 1.5.1
* Windows 7 32bit / Anaconda Python 2.7.6 and 3.4.1 / OpenJPEG 2.1.0
------------ ------------
Known Issues Known Issues

View file

@ -772,7 +772,7 @@ class Jp2k(Jp2kBox):
# Should have a slice object where start = stop = step = None # Should have a slice object where start = stop = step = None
self.write(data) self.write(data)
else: else:
msg = "Images currently must be written entirely at once." msg = "Partial write operations are currently not allowed."
raise TypeError(msg) raise TypeError(msg)
def __getitem__(self, pargs): def __getitem__(self, pargs):
@ -832,9 +832,11 @@ class Jp2k(Jp2kBox):
# one of them. # one of them.
step = rows_step step = rows_step
if np.log2(step) != np.floor(np.log2(step)): # Check if the step size is a power of 2.
if np.abs(np.log2(step) - np.round(np.log2(step))) > 1e-6:
msg = "Row and column strides must be powers of 2." msg = "Row and column strides must be powers of 2."
raise IndexError(msg) raise IndexError(msg)
rlevel = np.int(np.round(np.log2(step)))
if rows.start is None: if rows.start is None:
rows_start = 0 rows_start = 0
@ -857,7 +859,7 @@ class Jp2k(Jp2kBox):
cols_stop = cols.stop cols_stop = cols.stop
area = (rows_start, cols_start, rows_stop, cols_stop) area = (rows_start, cols_start, rows_stop, cols_stop)
data = self.read(area=area, rlevel=np.int(np.log2(step))) data = self.read(area=area, rlevel=rlevel)
if len(pargs) == 2: if len(pargs) == 2:
return data return data

View file

@ -71,6 +71,7 @@ class TestSuite(unittest.TestCase):
Jp2k(self.jp2file) Jp2k(self.jp2file)
@unittest.skipIf(WARNING_INFRASTRUCTURE_ISSUE, WARNING_INFRASTRUCTURE_MSG) @unittest.skipIf(WARNING_INFRASTRUCTURE_ISSUE, WARNING_INFRASTRUCTURE_MSG)
@unittest.skipIf(os.name == "nt", 'named temporary file issue on windows')
def test_xdg_env_config_file_is_bad(self): def test_xdg_env_config_file_is_bad(self):
"""A non-existant library location should be rejected.""" """A non-existant library location should be rejected."""
with tempfile.TemporaryDirectory() as tdir: with tempfile.TemporaryDirectory() as tdir:

View file

@ -19,7 +19,7 @@ from .lib import openjp2 as opj2
# Do not change the format of this next line! Doing so risks breaking # Do not change the format of this next line! Doing so risks breaking
# setup.py # setup.py
version = "0.7.0rc1" version = "0.7.0rc2"
_sv = LooseVersion(version) _sv = LooseVersion(version)
version_tuple = _sv.version version_tuple = _sv.version