Compare commits
8 commits
master
...
release-0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14af46abeb | ||
|
|
83eaded778 | ||
|
|
760da6bade | ||
|
|
1b0f60298d | ||
|
|
56042efd98 | ||
|
|
1341a15f7b | ||
|
|
e2661ee7f4 | ||
|
|
fc2519ca75 |
9 changed files with 46 additions and 24 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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. ::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue