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
|
||||
for Python 2.6. Added write support for JP2 UUID, DataEntryURL,
|
||||
Palette and Component Mapping boxes, JPX Association, NumberList
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ copyright = u'2013, John Evans'
|
|||
# The short X.Y version.
|
||||
version = '0.7'
|
||||
# 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
|
||||
# for a list of supported languages.
|
||||
|
|
|
|||
|
|
@ -24,11 +24,11 @@ configuration format is the same as used by Python’s configparser
|
|||
module, i.e. ::
|
||||
|
||||
[library]
|
||||
openjp2: /opt/openjp2-svn/lib/libopenjp2.so
|
||||
openjp2: /somewhere/lib/libopenjp2.so
|
||||
|
||||
This assumes, of course, that you've installed OpenJPEG into
|
||||
/opt/openjp2-svn 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
|
||||
/opt/openjpeg on a linux system. The location of the configuration file
|
||||
can vary as well. If you use either linux or mac, the path
|
||||
to the configuration file would normally be ::
|
||||
|
||||
$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. ::
|
||||
|
||||
[library]
|
||||
openjpeg: /not/the/usual/location/lib/libopenjpeg.so
|
||||
openjpeg: /somewhere/lib/libopenjpeg.so
|
||||
|
||||
'''''''
|
||||
Testing
|
||||
|
|
|
|||
|
|
@ -7,11 +7,11 @@ How do I...?
|
|||
================
|
||||
Jp2k implements slicing via the :py:meth:`__getitem__` method, meaning that
|
||||
multiple resolution imagery in a JPEG 2000 file can
|
||||
easily be accessed. For example here's how to retrieve a full resolution and
|
||||
first lower-resolution image ::
|
||||
easily be accessed via array-style slicing. For example here's how to
|
||||
retrieve a full resolution and first lower-resolution image ::
|
||||
|
||||
>>> import glymur
|
||||
>>> jp2file = glymur.data.nemo()
|
||||
>>> jp2file = glymur.data.nemo() # just a path to a JPEG2000 file
|
||||
>>> jp2 = glymur.Jp2k(jp2file)
|
||||
>>> fullres = jp2[:]
|
||||
>>> print(fullres.shape)
|
||||
|
|
@ -20,8 +20,21 @@ first lower-resolution image ::
|
|||
>>> print(thumbnail.shape)
|
||||
(728, 1296, 3)
|
||||
|
||||
The :py:meth:`read` method gives many more options for other JPEG 2000 features
|
||||
such as quality layers.
|
||||
The :py:meth:`read` method exposes many more options for other JPEG 2000
|
||||
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?
|
||||
=====================
|
||||
|
|
@ -328,10 +341,10 @@ is currently limited to XML and UUID boxes.
|
|||
... create an image with an alpha layer?
|
||||
========================================
|
||||
|
||||
OpenJPEG can create JP2 files with more than 3 components (requires
|
||||
the development version of OpenJPEG), but by default, any extra components are
|
||||
not described as such. In order to do so, we need to rewrap such
|
||||
an image in a set of boxes that includes a channel definition box.
|
||||
OpenJPEG can create JP2 files with more than 3 components (use version 2.1.0+
|
||||
for this), but by default, any extra components are not described
|
||||
as such. In order to do so, we need to rewrap such an image in a
|
||||
set of boxes that includes a channel definition box.
|
||||
|
||||
This example is based on SciPy example code found at
|
||||
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?
|
||||
========================
|
||||
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. ::
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
released version of OpenJPEG at this time.
|
||||
|
||||
|
||||
In regards to metadata, most JP2 boxes are properly interpreted.
|
||||
Certain optional JP2 boxes can also be written, including XML boxes and
|
||||
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.
|
||||
|
||||
For more information about OpenJPEG, please consult http://www.openjpeg.org.
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@
|
|||
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
|
||||
* 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
|
||||
* 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
|
||||
|
|
|
|||
|
|
@ -772,7 +772,7 @@ class Jp2k(Jp2kBox):
|
|||
# Should have a slice object where start = stop = step = None
|
||||
self.write(data)
|
||||
else:
|
||||
msg = "Images currently must be written entirely at once."
|
||||
msg = "Partial write operations are currently not allowed."
|
||||
raise TypeError(msg)
|
||||
|
||||
def __getitem__(self, pargs):
|
||||
|
|
@ -832,9 +832,11 @@ class Jp2k(Jp2kBox):
|
|||
# one of them.
|
||||
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."
|
||||
raise IndexError(msg)
|
||||
rlevel = np.int(np.round(np.log2(step)))
|
||||
|
||||
if rows.start is None:
|
||||
rows_start = 0
|
||||
|
|
@ -857,7 +859,7 @@ class Jp2k(Jp2kBox):
|
|||
cols_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:
|
||||
return data
|
||||
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ class TestSuite(unittest.TestCase):
|
|||
Jp2k(self.jp2file)
|
||||
|
||||
@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):
|
||||
"""A non-existant library location should be rejected."""
|
||||
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
|
||||
# setup.py
|
||||
version = "0.7.0rc1"
|
||||
version = "0.7.0rc2"
|
||||
_sv = LooseVersion(version)
|
||||
version_tuple = _sv.version
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue