From 0e5320a4fbf4127705fc0f549a2a21cc4313329f Mon Sep 17 00:00:00 2001 From: John Evans Date: Thu, 6 Jun 2013 18:55:29 -0400 Subject: [PATCH 1/4] Exif classes are now private. Closes #33. --- glymur/jp2box.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/glymur/jp2box.py b/glymur/jp2box.py index f1ccf8e..6a75f46 100644 --- a/glymur/jp2box.py +++ b/glymur/jp2box.py @@ -1669,28 +1669,28 @@ class Exif: offset = data[3] # This is the 'Exif Image' portion. - exif = ExifImageIfd(self.endian, buffer[6:], offset) + exif = _ExifImageIfd(self.endian, buffer[6:], offset) self.exif_image = exif.ifd if 'ExifTag' in self.exif_image.keys(): offset = self.exif_image['ExifTag'] - photo = ExifPhotoIfd(self.endian, buffer[6:], offset) + photo = _ExifPhotoIfd(self.endian, buffer[6:], offset) self.exif_photo = photo.ifd if 'InteroperabilityTag' in self.exif_photo.keys(): offset = self.exif_photo['InteroperabilityTag'] - interop = ExifInteroperabilityIfd(self.endian, + interop = _ExifInteroperabilityIfd(self.endian, buffer[6:], offset) self.iop = interop.ifd if 'GPSTag' in self.exif_image.keys(): offset = self.exif_image['GPSTag'] - gps = ExifGPSInfoIfd(self.endian, buffer[6:], offset) + gps = _ExifGPSInfoIfd(self.endian, buffer[6:], offset) self.exif_gpsinfo = gps.ifd -class Ifd: +class _Ifd: """ Attributes ---------- @@ -1775,7 +1775,7 @@ class Ifd: return payload -class ExifImageIfd(Ifd): +class _ExifImageIfd(_Ifd): """ Attributes ---------- @@ -1990,7 +1990,7 @@ class ExifImageIfd(Ifd): 51041: 'NoiseProfile'} def __init__(self, endian, buffer, offset): - Ifd.__init__(self, endian, buffer, offset) + _Ifd.__init__(self, endian, buffer, offset) # Now post process the raw IFD. self.ifd = {} @@ -1999,7 +1999,7 @@ class ExifImageIfd(Ifd): self.ifd[tag_name] = value -class ExifPhotoIfd(Ifd): +class _ExifPhotoIfd(_Ifd): tagnum2name = {33434: 'ExposureTime', 33437: 'FNumber', 34850: 'ExposureProgram', @@ -2071,7 +2071,7 @@ class ExifPhotoIfd(Ifd): 42037: 'LensSerialNumber'} def __init__(self, endian, buffer, offset): - Ifd.__init__(self, endian, buffer, offset) + _Ifd.__init__(self, endian, buffer, offset) # Now post process the raw IFD. self.ifd = {} @@ -2080,7 +2080,7 @@ class ExifPhotoIfd(Ifd): self.ifd[tag_name] = value -class ExifGPSInfoIfd(Ifd): +class _ExifGPSInfoIfd(_Ifd): tagnum2name = {0: 'GPSVersionID', 1: 'GPSLatitudeRef', 2: 'GPSLatitude', @@ -2114,7 +2114,7 @@ class ExifGPSInfoIfd(Ifd): 30: 'GPSDifferential'} def __init__(self, endian, buffer, offset): - Ifd.__init__(self, endian, buffer, offset) + _Ifd.__init__(self, endian, buffer, offset) # Now post process the raw IFD. self.ifd = {} @@ -2123,7 +2123,7 @@ class ExifGPSInfoIfd(Ifd): self.ifd[tag_name] = value -class ExifInteroperabilityIfd(Ifd): +class _ExifInteroperabilityIfd(_Ifd): tagnum2name = {1: 'InteroperabilityIndex', 2: 'InteroperabilityVersion', 4096: 'RelatedImageFileFormat', @@ -2131,7 +2131,7 @@ class ExifInteroperabilityIfd(Ifd): 4098: 'RelatedImageLength'} def __init__(self, endian, buffer, offset): - Ifd.__init__(self, endian, buffer, offset) + _Ifd.__init__(self, endian, buffer, offset) # Now post process the raw IFD. self.ifd = {} From 3b666c4eca2d9a0739eeee654fcd4ca66fa32ce0 Mon Sep 17 00:00:00 2001 From: John Evans Date: Thu, 6 Jun 2013 19:03:02 -0400 Subject: [PATCH 2/4] Mentioned installing directly via pip. Closes #34. --- docs/source/introduction.rst | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst index a0e5907..7f3a5ed 100644 --- a/docs/source/introduction.rst +++ b/docs/source/introduction.rst @@ -142,18 +142,25 @@ From this point forward, python3 will be referred to as just "python". Installation ============ -First, get the code by going to either of +You can install glymur via pip from the command line:: + + $ pip install glymur + +or manually retrieve the code from either of GitHub or PyPI * https://pypi.python.org/pypi/Glymur/ (stable releases) * http://github.com/quintusdias/glymur (bleeding edge) +and then unpack and install with:: + + $ python setup.py install --prefix=/install/path + In addition to merely installing glymur, you should adjust your **$PATH** environment variable in order to be able to use the *jp2dump* script from the unix command line. :: - $ python setup.py install --prefix=/install/path $ export PYTHONPATH=/install/path/lib/python3.3/site-packages $ export PATH=/install/path/bin:$PATH From 38f7c3049aecdf2e360e5f42dd4ced4fa94f624b Mon Sep 17 00:00:00 2001 From: John Evans Date: Thu, 6 Jun 2013 19:20:24 -0400 Subject: [PATCH 3/4] Refactored IFD post processing. Closes #35. --- glymur/jp2box.py | 47 ++++++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/glymur/jp2box.py b/glymur/jp2box.py index 6a75f46..789c803 100644 --- a/glymur/jp2box.py +++ b/glymur/jp2box.py @@ -1670,24 +1670,24 @@ class Exif: # This is the 'Exif Image' portion. exif = _ExifImageIfd(self.endian, buffer[6:], offset) - self.exif_image = exif.ifd + self.exif_image = exif.processed_ifd if 'ExifTag' in self.exif_image.keys(): offset = self.exif_image['ExifTag'] photo = _ExifPhotoIfd(self.endian, buffer[6:], offset) - self.exif_photo = photo.ifd + self.exif_photo = photo.processed_ifd if 'InteroperabilityTag' in self.exif_photo.keys(): offset = self.exif_photo['InteroperabilityTag'] interop = _ExifInteroperabilityIfd(self.endian, - buffer[6:], - offset) - self.iop = interop.ifd + buffer[6:], + offset) + self.iop = interop.processed_ifd if 'GPSTag' in self.exif_image.keys(): offset = self.exif_image['GPSTag'] gps = _ExifGPSInfoIfd(self.endian, buffer[6:], offset) - self.exif_gpsinfo = gps.ifd + self.exif_gpsinfo = gps.processed_ifd class _Ifd: @@ -1705,6 +1705,8 @@ class _Ifd: Number of tags in the IFD. raw_ifd : dictionary Maps tag number to "mildly-interpreted" tag value. + processed_ifd : dictionary + Maps tag name to "mildly-interpreted" tag value. """ datatype2fmt = {1: ('B', 1), 2: ('B', 1), @@ -1718,6 +1720,7 @@ class _Ifd: def __init__(self, endian, buffer, offset): self.endian = endian self.buffer = buffer + self.processed_ifd = {} self.num_tags, = struct.unpack(endian + 'H', buffer[offset:offset + 2]) @@ -1774,6 +1777,11 @@ class _Ifd: return payload + def post_process(self, tagnum2name): + for tag, value in self.raw_ifd.items(): + tag_name = tagnum2name[tag] + self.processed_ifd[tag_name] = value + class _ExifImageIfd(_Ifd): """ @@ -1991,12 +1999,7 @@ class _ExifImageIfd(_Ifd): def __init__(self, endian, buffer, offset): _Ifd.__init__(self, endian, buffer, offset) - - # Now post process the raw IFD. - self.ifd = {} - for tag, value in self.raw_ifd.items(): - tag_name = self.tagnum2name[tag] - self.ifd[tag_name] = value + self.post_process(self.tagnum2name) class _ExifPhotoIfd(_Ifd): @@ -2072,12 +2075,7 @@ class _ExifPhotoIfd(_Ifd): def __init__(self, endian, buffer, offset): _Ifd.__init__(self, endian, buffer, offset) - - # Now post process the raw IFD. - self.ifd = {} - for tag, value in self.raw_ifd.items(): - tag_name = self.tagnum2name[tag] - self.ifd[tag_name] = value + self.post_process(self.tagnum2name) class _ExifGPSInfoIfd(_Ifd): @@ -2115,12 +2113,7 @@ class _ExifGPSInfoIfd(_Ifd): def __init__(self, endian, buffer, offset): _Ifd.__init__(self, endian, buffer, offset) - - # Now post process the raw IFD. - self.ifd = {} - for tag, value in self.raw_ifd.items(): - tag_name = self.tagnum2name[tag] - self.ifd[tag_name] = value + self.post_process(self.tagnum2name) class _ExifInteroperabilityIfd(_Ifd): @@ -2132,12 +2125,8 @@ class _ExifInteroperabilityIfd(_Ifd): def __init__(self, endian, buffer, offset): _Ifd.__init__(self, endian, buffer, offset) + self.post_process(self.tagnum2name) - # Now post process the raw IFD. - self.ifd = {} - for tag, value in self.raw_ifd.items(): - tag_name = self.tagnum2name[tag] - self.ifd[tag_name] = value # Map each box ID to the corresponding class. _box_with_id = { From 1e218332282703b830622eb1d2b46dbd4b37b913 Mon Sep 17 00:00:00 2001 From: John Evans Date: Thu, 6 Jun 2013 19:26:40 -0400 Subject: [PATCH 4/4] Bumping to 0.1.6 --- CHANGES.txt | 3 +++ docs/source/conf.py | 2 +- setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index b935fba..056f3a9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +Jun 06, 2013 - v0.1.6 Exif classes made private. Refactored IFD post + processing. Corrected omission of Exif in UUIDBox docstring. + Jun 06, 2013 - v0.1.5 Changed ColourSpecificationBox attribute "color_space" to "colorspace". Fixed MANIFEST issue affecting PyPI installs. diff --git a/docs/source/conf.py b/docs/source/conf.py index fe4de6d..31eba3d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -78,7 +78,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.5' +release = '0.1.6' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index 962111b..3b8e14f 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from distutils.core import setup kwargs = {'name': 'Glymur', - 'version': '0.1.5', + 'version': '0.1.6', 'description': 'Tools for accessing JPEG2000 files', 'long_description': open('README.md').read(), 'author': 'John Evans',