Merge branch 'issue68' into release-0.2.0

Conflicts:
	release.txt
This commit is contained in:
John Evans 2013-07-10 18:43:32 -04:00
commit bfdebf5b48
16 changed files with 151 additions and 72 deletions

View file

@ -17,8 +17,8 @@ def nemo():
file : str file : str
Platform-independent path to nemo.jp2. Platform-independent path to nemo.jp2.
""" """
file = pkg_resources.resource_filename(__name__, "nemo.jp2") filename = pkg_resources.resource_filename(__name__, "nemo.jp2")
return file return filename
def goodstuff(): def goodstuff():
@ -29,5 +29,5 @@ def goodstuff():
file : str file : str
Platform-independent path to goodstuff.j2k. Platform-independent path to goodstuff.j2k.
""" """
file = pkg_resources.resource_filename(__name__, "goodstuff.j2k") filename = pkg_resources.resource_filename(__name__, "goodstuff.j2k")
return file return filename

View file

@ -83,7 +83,7 @@ def read_config_file():
that we currently care about is still in the svn trunk at openjpeg.org. that we currently care about is still in the svn trunk at openjpeg.org.
We must use a configuration file that the user must write. We must use a configuration file that the user must write.
""" """
lib = {} lib = {'openjp2': None, 'openjpeg': None}
filename = glymurrc_fname() filename = glymurrc_fname()
if filename is not None: if filename is not None:
# Read the configuration file for the library location. # Read the configuration file for the library location.
@ -92,11 +92,11 @@ def read_config_file():
try: try:
lib['openjp2'] = parser.get('library', 'openjp2') lib['openjp2'] = parser.get('library', 'openjp2')
except NoOptionError: except NoOptionError:
lib['openjp2'] = None pass
try: try:
lib['openjpeg'] = parser.get('library', 'openjpeg') lib['openjpeg'] = parser.get('library', 'openjpeg')
except NoOptionError: except NoOptionError:
lib['openjpeg'] = None pass
return lib return lib
@ -113,7 +113,7 @@ def load_openjp2(libopenjp2_path):
openjp2_lib = ctypes.windll.LoadLibrary(libopenjp2_path) openjp2_lib = ctypes.windll.LoadLibrary(libopenjp2_path)
else: else:
openjp2_lib = ctypes.CDLL(libopenjp2_path) openjp2_lib = ctypes.CDLL(libopenjp2_path)
except OSError: except (TypeError, OSError):
msg = '"Library {0}" could not be loaded. Operating in degraded mode.' msg = '"Library {0}" could not be loaded. Operating in degraded mode.'
msg = msg.format(libopenjp2_path) msg = msg.format(libopenjp2_path)
warnings.warn(msg, UserWarning) warnings.warn(msg, UserWarning)

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import doctest import doctest
import os import os
import pkg_resources import pkg_resources
@ -12,6 +13,7 @@ import numpy as np
import glymur import glymur
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
@unittest.skipIf(glymur.lib._openjp2.OPENJP2 is None, @unittest.skipIf(glymur.lib._openjp2.OPENJP2 is None,
"Missing openjp2 library.") "Missing openjp2 library.")
class TestOpenJP2(unittest.TestCase): class TestOpenJP2(unittest.TestCase):

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import ctypes import ctypes
import unittest import unittest

View file

@ -3,19 +3,18 @@ import sys
import numpy as np import numpy as np
def mse(A, B): def mse(amat, bmat):
"""Mean Square Error""" """Mean Square Error"""
diff = A.astype(np.double) - B.astype(np.double) diff = amat.astype(np.double) - bmat.astype(np.double)
#e = np.sqrt(np.mean(diff**2)) err = np.mean(diff**2)
e = np.mean(diff**2) return err
return e
def peak_tolerance(A, B): def peak_tolerance(amat, bmat):
"""Peak Tolerance""" """Peak Tolerance"""
diff = np.abs(A.astype(np.double) - B.astype(np.double)) diff = np.abs(amat.astype(np.double) - bmat.astype(np.double))
p = diff.max() ptol = diff.max()
return p return ptol
def read_pgx(pgx_file): def read_pgx(pgx_file):
@ -28,42 +27,42 @@ def read_pgx(pgx_file):
PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d" PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d"
""" """
header = '' header = ''
with open(pgx_file, 'rb') as fp: with open(pgx_file, 'rb') as fptr:
while True: while True:
x = fp.read(1) char = fptr.read(1)
if x[0] == 10 or x == '\n': if char[0] == 10 or char == '\n':
pos = fp.tell() pos = fptr.tell()
break break
else: else:
if sys.hexversion < 0x03000000: if sys.hexversion < 0x03000000:
header += x header += char
else: else:
header += chr(x[0]) header += chr(char[0])
header = header.rstrip() header = header.rstrip()
n = re.split('\s', header) tokens = re.split('\s', header)
if (n[1][0] == 'M') and (sys.byteorder == 'little'): if (tokens[1][0] == 'M') and (sys.byteorder == 'little'):
swapbytes = True swapbytes = True
elif (n[1][0] == 'L') and (sys.byteorder == 'big'): elif (tokens[1][0] == 'L') and (sys.byteorder == 'big'):
swapbytes = True swapbytes = True
else: else:
swapbytes = False swapbytes = False
if (len(n) == 6): if (len(tokens) == 6):
bitdepth = int(n[3]) bitdepth = int(tokens[3])
signed = bitdepth < 0 signed = bitdepth < 0
if signed: if signed:
bitdepth = -1 * bitdepth bitdepth = -1 * bitdepth
nrows = int(n[5]) nrows = int(tokens[5])
ncols = int(n[4]) ncols = int(tokens[4])
else: else:
bitdepth = int(n[2]) bitdepth = int(tokens[2])
signed = bitdepth < 0 signed = bitdepth < 0
if signed: if signed:
bitdepth = -1 * bitdepth bitdepth = -1 * bitdepth
nrows = int(n[4]) nrows = int(tokens[4])
ncols = int(n[3]) ncols = int(tokens[3])
if signed: if signed:
if bitdepth <= 8: if bitdepth <= 8:
@ -84,9 +83,9 @@ def read_pgx(pgx_file):
# Reopen the file in binary mode and seek to the start of the binary # Reopen the file in binary mode and seek to the start of the binary
# data # data
with open(pgx_file, 'rb') as fp: with open(pgx_file, 'rb') as fptr:
fp.seek(pos) fptr.seek(pos)
data = np.fromfile(file=fp, dtype=dtype).reshape(shape) data = np.fromfile(file=fptr, dtype=dtype).reshape(shape)
return(data.byteswap(swapbytes)) return(data.byteswap(swapbytes))

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import os import os
import pkg_resources import pkg_resources
import re import re
@ -29,6 +30,7 @@ class TestCallbacks(unittest.TestCase):
# Restore stdout. # Restore stdout.
sys.stdout = self.stdout sys.stdout = self.stdout
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_info_callback_on_write(self): def test_info_callback_on_write(self):
# Verify the messages printed when writing an image in verbose mode. # Verify the messages printed when writing an image in verbose mode.
j = glymur.Jp2k(self.jp2file) j = glymur.Jp2k(self.jp2file)

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import os import os
import struct import struct
import sys import sys
@ -29,6 +30,7 @@ class TestCodestream(unittest.TestCase):
def tearDown(self): def tearDown(self):
pass pass
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_reserved_marker_segment(self): def test_reserved_marker_segment(self):
# Some marker segments were reserved in FCD15444-1. Since that # Some marker segments were reserved in FCD15444-1. Since that
# standard is old, some of them may have come into use. # standard is old, some of them may have come into use.
@ -58,6 +60,7 @@ class TestCodestream(unittest.TestCase):
self.assertEqual(c.segment[2].length, 3) self.assertEqual(c.segment[2].length, 3)
self.assertEqual(c.segment[2]._data, b'\x00') self.assertEqual(c.segment[2]._data, b'\x00')
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
@unittest.skipIf(sys.hexversion < 0x03020000, @unittest.skipIf(sys.hexversion < 0x03020000,
"Uses features introduced in 3.2.") "Uses features introduced in 3.2.")
def test_unknown_marker_segment(self): def test_unknown_marker_segment(self):

View file

@ -1,6 +1,7 @@
"""These tests are for edge cases where OPENJPEG does not exist, but """These tests are for edge cases where OPENJPEG does not exist, but
OPENJP2 may be present in some form or other. OPENJP2 may be present in some form or other.
""" """
#pylint: disable-all
import imp import imp
import os import os

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import datetime import datetime
import os import os
import struct import struct

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import doctest import doctest
import os import os
import tempfile import tempfile
@ -14,10 +15,14 @@ from glymur.jp2box import *
# Doc tests should be run as well. # Doc tests should be run as well.
def load_tests(loader, tests, ignore): def load_tests(loader, tests, ignore):
if os.name == "nt":
# Can't do it on windows, temporary file issue.
return tests
tests.addTests(doctest.DocTestSuite('glymur.jp2box')) tests.addTests(doctest.DocTestSuite('glymur.jp2box'))
return tests return tests
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
@unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None, @unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None,
"Missing openjp2 library.") "Missing openjp2 library.")
class TestChannelDefinition(unittest.TestCase): class TestChannelDefinition(unittest.TestCase):
@ -232,6 +237,7 @@ class TestChannelDefinition(unittest.TestCase):
association=[1, 2, 3]) association=[1, 2, 3])
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
class TestXML(unittest.TestCase): class TestXML(unittest.TestCase):
def setUp(self): def setUp(self):
@ -370,6 +376,7 @@ class TestColourSpecificationBox(unittest.TestCase):
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
j2k.wrap(tfile.name, boxes=boxes) j2k.wrap(tfile.name, boxes=boxes)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_missing_colr_box(self): def test_missing_colr_box(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
boxes = [self.jP, self.ftyp, self.jp2h, self.jp2c] boxes = [self.jP, self.ftyp, self.jp2h, self.jp2c]
@ -501,12 +508,14 @@ class TestJp2Boxes(unittest.TestCase):
self.assertEqual(jp2.box[2].box[1].colorspace, glymur.core.SRGB) self.assertEqual(jp2.box[2].box[1].colorspace, glymur.core.SRGB)
self.assertIsNone(jp2.box[2].box[1].icc_profile) self.assertIsNone(jp2.box[2].box[1].icc_profile)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_wrap(self): def test_wrap(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile: with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile:
j2k.wrap(tfile.name) j2k.wrap(tfile.name)
self.verify_wrapped_raw(tfile.name) self.verify_wrapped_raw(tfile.name)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_wrap_jp2(self): def test_wrap_jp2(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile: with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile:
@ -514,6 +523,7 @@ class TestJp2Boxes(unittest.TestCase):
boxes = [box.box_id for box in jp2.box] boxes = [box.box_id for box in jp2.box]
self.assertEqual(boxes, ['jP ', 'ftyp', 'jp2h', 'jp2c']) self.assertEqual(boxes, ['jP ', 'ftyp', 'jp2h', 'jp2c'])
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_default_layout_but_with_specified_boxes(self): def test_default_layout_but_with_specified_boxes(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
boxes = [JPEG2000SignatureBox(), boxes = [JPEG2000SignatureBox(),
@ -532,6 +542,7 @@ class TestJp2Boxes(unittest.TestCase):
j2k.wrap(tfile.name, boxes=boxes) j2k.wrap(tfile.name, boxes=boxes)
self.verify_wrapped_raw(tfile.name) self.verify_wrapped_raw(tfile.name)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_image_header_box_not_first_in_jp2_header(self): def test_image_header_box_not_first_in_jp2_header(self):
# The specification says that ihdr must be the first box in jp2h. # The specification says that ihdr must be the first box in jp2h.
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
@ -551,6 +562,7 @@ class TestJp2Boxes(unittest.TestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
j2k.wrap(tfile.name, boxes=boxes) j2k.wrap(tfile.name, boxes=boxes)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_first_2_boxes_not_jP_and_ftyp(self): def test_first_2_boxes_not_jP_and_ftyp(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
c = j2k.get_codestream() c = j2k.get_codestream()
@ -571,6 +583,7 @@ class TestJp2Boxes(unittest.TestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
j2k.wrap(tfile.name, boxes=boxes) j2k.wrap(tfile.name, boxes=boxes)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_jp2h_not_preceeding_jp2c(self): def test_jp2h_not_preceeding_jp2c(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
c = j2k.get_codestream() c = j2k.get_codestream()
@ -591,6 +604,7 @@ class TestJp2Boxes(unittest.TestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
j2k.wrap(tfile.name, boxes=boxes) j2k.wrap(tfile.name, boxes=boxes)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_missing_codestream(self): def test_missing_codestream(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
c = j2k.get_codestream() c = j2k.get_codestream()

View file

@ -1,7 +1,5 @@
import contextlib # pylint: disable-all
import ctypes
import doctest import doctest
import imp
import os import os
import re import re
import shutil import shutil
@ -33,14 +31,18 @@ except:
# Doc tests should be run as well. # Doc tests should be run as well.
def load_tests(loader, tests, ignore): def load_tests(loader, tests, ignore):
if os.name == "nt":
# Can't do it on windows, temporary file issue.
return tests
if glymur.lib.openjp2.OPENJP2 is not None: if glymur.lib.openjp2.OPENJP2 is not None:
tests.addTests(doctest.DocTestSuite('glymur.jp2k')) tests.addTests(doctest.DocTestSuite('glymur.jp2k'))
return tests return tests
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
@unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None, @unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None,
"Missing openjp2 library.") "Missing openjp2 library.")
class TestJp2k(unittest.TestCase): class TestJp2kBadXmlFile(unittest.TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
@ -88,14 +90,6 @@ class TestJp2k(unittest.TestCase):
with self.assertWarns(UserWarning) as cw: with self.assertWarns(UserWarning) as cw:
jp2k = Jp2k(self._bad_xml_file) jp2k = Jp2k(self._bad_xml_file)
def test_rlevel_max(self):
# Verify that rlevel=-1 gets us the lowest resolution image
j = Jp2k(self.j2kfile)
thumbnail1 = j.read(rlevel=-1)
thumbnail2 = j.read(rlevel=5)
np.testing.assert_array_equal(thumbnail1, thumbnail2)
self.assertEqual(thumbnail1.shape, (25, 15, 3))
def test_invalid_xml_box(self): def test_invalid_xml_box(self):
# Should be able to recover from xml box with bad xml. # Should be able to recover from xml box with bad xml.
with warnings.catch_warnings(): with warnings.catch_warnings():
@ -107,6 +101,27 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(jp2k.box[3].length, 28) self.assertEqual(jp2k.box[3].length, 28)
self.assertIsNone(jp2k.box[3].xml) self.assertIsNone(jp2k.box[3].xml)
@unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None,
"Missing openjp2 library.")
class TestJp2k(unittest.TestCase):
def setUp(self):
self.jp2file = glymur.data.nemo()
self.j2kfile = glymur.data.goodstuff()
def tearDown(self):
pass
def test_rlevel_max(self):
# Verify that rlevel=-1 gets us the lowest resolution image
j = Jp2k(self.j2kfile)
thumbnail1 = j.read(rlevel=-1)
thumbnail2 = j.read(rlevel=5)
np.testing.assert_array_equal(thumbnail1, thumbnail2)
self.assertEqual(thumbnail1.shape, (25, 15, 3))
def test_bad_area_parameter(self): def test_bad_area_parameter(self):
# Verify that we error out appropriately if given a bad area parameter. # Verify that we error out appropriately if given a bad area parameter.
j = Jp2k(self.jp2file) j = Jp2k(self.jp2file)
@ -143,6 +158,7 @@ class TestJp2k(unittest.TestCase):
filename = 'this file does not actually exist on the file system.' filename = 'this file does not actually exist on the file system.'
jp2k = Jp2k(filename) jp2k = Jp2k(filename)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_write_srgb_without_mct(self): def test_write_srgb_without_mct(self):
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
expdata = j2k.read() expdata = j2k.read()
@ -155,6 +171,7 @@ class TestJp2k(unittest.TestCase):
c = ofile.get_codestream() c = ofile.get_codestream()
self.assertEqual(c.segment[2].spcod[3], 0) # no mct self.assertEqual(c.segment[2].spcod[3], 0) # no mct
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_write_grayscale_with_mct(self): def test_write_grayscale_with_mct(self):
# MCT usage makes no sense for grayscale images. # MCT usage makes no sense for grayscale images.
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
@ -164,6 +181,7 @@ class TestJp2k(unittest.TestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
ofile.write(expdata[:, :, 0], mct=True) ofile.write(expdata[:, :, 0], mct=True)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_write_cprl(self): def test_write_cprl(self):
# Issue 17 # Issue 17
j = Jp2k(self.jp2file) j = Jp2k(self.jp2file)
@ -244,6 +262,7 @@ class TestJp2k(unittest.TestCase):
jp2k = Jp2k(filename) jp2k = Jp2k(filename)
self.assertEqual(len(jp2k.box), 0) self.assertEqual(len(jp2k.box), 0)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_64bit_XL_field(self): def test_64bit_XL_field(self):
# Verify that boxes with the XL field are properly read. # Verify that boxes with the XL field are properly read.
# Don't have such a file on hand, so we create one. Copy our example # Don't have such a file on hand, so we create one. Copy our example
@ -276,6 +295,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(jp2k.box[5].offset, 3127) self.assertEqual(jp2k.box[5].offset, 3127)
self.assertEqual(jp2k.box[5].length, 1133427 + 8) self.assertEqual(jp2k.box[5].length, 1133427 + 8)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_L_is_zero(self): def test_L_is_zero(self):
# Verify that boxes with the L field as zero are correctly read. # Verify that boxes with the L field as zero are correctly read.
# This should only happen in the last box of a JPEG 2000 file. # This should only happen in the last box of a JPEG 2000 file.
@ -331,6 +351,7 @@ class TestJp2k(unittest.TestCase):
j = Jp2k(filename) j = Jp2k(filename)
self.assertEqual(j.box, []) self.assertEqual(j.box, [])
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_code_block_height_different_than_width(self): def test_code_block_height_different_than_width(self):
# Verify that we can set a code block size where height does not equal # Verify that we can set a code block size where height does not equal
# width. # width.
@ -346,6 +367,7 @@ class TestJp2k(unittest.TestCase):
# Code block size is reported as XY in the codestream. # Code block size is reported as XY in the codestream.
self.assertEqual(tuple(c.segment[2].spcod[5:7]), (3, 2)) self.assertEqual(tuple(c.segment[2].spcod[5:7]), (3, 2))
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_negative_too_many_dimensions(self): def test_negative_too_many_dimensions(self):
# OpenJP2 only allows 2D or 3D images. # OpenJP2 only allows 2D or 3D images.
with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile:
@ -354,6 +376,7 @@ class TestJp2k(unittest.TestCase):
data = np.zeros((128, 128, 2, 2), dtype=np.uint8) data = np.zeros((128, 128, 2, 2), dtype=np.uint8)
j.write(data) j.write(data)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_unrecognized_jp2_colorspace(self): def test_unrecognized_jp2_colorspace(self):
# We only allow RGB and GRAYSCALE. # We only allow RGB and GRAYSCALE.
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
@ -362,6 +385,7 @@ class TestJp2k(unittest.TestCase):
data = np.zeros((128, 128, 3), dtype=np.uint8) data = np.zeros((128, 128, 3), dtype=np.uint8)
j.write(data, colorspace='cmyk') j.write(data, colorspace='cmyk')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_2D_rgb(self): def test_2D_rgb(self):
# RGB must have at least 3 components. # RGB must have at least 3 components.
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
@ -370,6 +394,7 @@ class TestJp2k(unittest.TestCase):
data = np.zeros((128, 128, 2), dtype=np.uint8) data = np.zeros((128, 128, 2), dtype=np.uint8)
j.write(data, colorspace='rgb') j.write(data, colorspace='rgb')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_colorspace_with_j2k(self): def test_colorspace_with_j2k(self):
# Specifying a colorspace with J2K does not make sense. # Specifying a colorspace with J2K does not make sense.
with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile:
@ -378,6 +403,7 @@ class TestJp2k(unittest.TestCase):
data = np.zeros((128, 128, 3), dtype=np.uint8) data = np.zeros((128, 128, 3), dtype=np.uint8)
j.write(data, colorspace='rgb') j.write(data, colorspace='rgb')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_specify_rgb(self): def test_specify_rgb(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
j = Jp2k(tfile.name, 'wb') j = Jp2k(tfile.name, 'wb')
@ -385,6 +411,7 @@ class TestJp2k(unittest.TestCase):
j.write(data, colorspace='rgb') j.write(data, colorspace='rgb')
self.assertEqual(j.box[2].box[1].colorspace, glymur.core.SRGB) self.assertEqual(j.box[2].box[1].colorspace, glymur.core.SRGB)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_specify_gray(self): def test_specify_gray(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
j = Jp2k(tfile.name, 'wb') j = Jp2k(tfile.name, 'wb')
@ -393,6 +420,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(j.box[2].box[1].colorspace, self.assertEqual(j.box[2].box[1].colorspace,
glymur.core.GREYSCALE) glymur.core.GREYSCALE)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_specify_grey(self): def test_specify_grey(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
j = Jp2k(tfile.name, 'wb') j = Jp2k(tfile.name, 'wb')
@ -401,6 +429,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(j.box[2].box[1].colorspace, self.assertEqual(j.box[2].box[1].colorspace,
glymur.core.GREYSCALE) glymur.core.GREYSCALE)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_grey_with_extra_component(self): def test_grey_with_extra_component(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
j = Jp2k(tfile.name, 'wb') j = Jp2k(tfile.name, 'wb')
@ -412,6 +441,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(j.box[2].box[1].colorspace, self.assertEqual(j.box[2].box[1].colorspace,
glymur.core.GREYSCALE) glymur.core.GREYSCALE)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_grey_with_two_extra_components(self): def test_grey_with_two_extra_components(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
j = Jp2k(tfile.name, 'wb') j = Jp2k(tfile.name, 'wb')
@ -423,6 +453,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(j.box[2].box[1].colorspace, self.assertEqual(j.box[2].box[1].colorspace,
glymur.core.GREYSCALE) glymur.core.GREYSCALE)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_rgb_with_extra_component(self): def test_rgb_with_extra_component(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
j = Jp2k(tfile.name, 'wb') j = Jp2k(tfile.name, 'wb')
@ -441,6 +472,7 @@ class TestJp2k(unittest.TestCase):
data = np.zeros((128, 128, 3), dtype=np.uint8) data = np.zeros((128, 128, 3), dtype=np.uint8)
j.write(data, colorspace='ycc') j.write(data, colorspace='ycc')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_uinf_ulst_url_boxes(self): def test_uinf_ulst_url_boxes(self):
# Verify that we can read UINF, ULST, and URL boxes. I don't have # Verify that we can read UINF, ULST, and URL boxes. I don't have
# easy access to such a file, and there's no such file in the # easy access to such a file, and there's no such file in the
@ -497,6 +529,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(jp2k.box[3].box[1].flag, (0, 0, 0)) self.assertEqual(jp2k.box[3].box[1].flag, (0, 0, 0))
self.assertEqual(jp2k.box[3].box[1].url, 'abcd') self.assertEqual(jp2k.box[3].box[1].url, 'abcd')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_xml_box_with_trailing_nulls(self): def test_xml_box_with_trailing_nulls(self):
# ElementTree does not like trailing null chars after valid XML # ElementTree does not like trailing null chars after valid XML
# text. # text.
@ -526,6 +559,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(jp2k.box[3].offset, 77) self.assertEqual(jp2k.box[3].offset, 77)
self.assertEqual(jp2k.box[3].length, 36) self.assertEqual(jp2k.box[3].length, 36)
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_asoc_label_box(self): def test_asoc_label_box(self):
# Construct a fake file with an asoc and a label box, as # Construct a fake file with an asoc and a label box, as
# OpenJPEG doesn't have such a file. # OpenJPEG doesn't have such a file.
@ -572,6 +606,7 @@ class TestJp2k(unittest.TestCase):
self.assertEqual(jasoc.box[3].box[0].label, 'label') self.assertEqual(jasoc.box[3].box[0].label, 'label')
self.assertEqual(jasoc.box[3].box[1].box_id, 'xml ') self.assertEqual(jasoc.box[3].box[1].box_id, 'xml ')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_openjpeg_library_message(self): def test_openjpeg_library_message(self):
# Verify the error message produced by the openjpeg library. # Verify the error message produced by the openjpeg library.
# This will confirm that the error callback mechanism is working. # This will confirm that the error callback mechanism is working.
@ -616,6 +651,7 @@ class TestJp2k(unittest.TestCase):
attr_value = elt.attrib['{0}CreatorTool'.format(ns1)] attr_value = elt.attrib['{0}CreatorTool'.format(ns1)]
self.assertEqual(attr_value, 'glymur') self.assertEqual(attr_value, 'glymur')
@unittest.skipIf(os.name == "nt", "NamedTemporaryFile issue on windows")
def test_unrecognized_exif_tag(self): def test_unrecognized_exif_tag(self):
# An unrecognized exif tag should be handled gracefully. # An unrecognized exif tag should be handled gracefully.
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
@ -671,42 +707,48 @@ class TestJp2k15(unittest.TestCase):
pass pass
def test_bands(self): def test_bands(self):
# Reading individual bands is an advanced maneuver. """Reading individual bands is an advanced maneuver.
"""
jp2k = Jp2k(self.j2kfile) jp2k = Jp2k(self.j2kfile)
with self.assertRaises(NotImplementedError) as ce: with self.assertRaises(NotImplementedError):
jpdata = jp2k.read_bands() jp2k.read_bands()
def test_area(self): def test_area(self):
# Area option not allowed for 1.5.1. """Area option not allowed for 1.5.1.
"""
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
with self.assertRaises(TypeError) as ce: with self.assertRaises(TypeError):
d = j2k.read(area=(0, 0, 100, 100)) j2k.read(area=(0, 0, 100, 100))
def test_tile(self): def test_tile(self):
# tile option not allowed for 1.5.1. """tile option not allowed for 1.5.1.
"""
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
with self.assertRaises(TypeError) as ce: with self.assertRaises(TypeError):
d = j2k.read(tile=0) j2k.read(tile=0)
def test_layer(self): def test_layer(self):
# layer option not allowed for 1.5.1. """layer option not allowed for 1.5.1.
"""
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
with self.assertRaises(TypeError) as ce: with self.assertRaises(TypeError):
d = j2k.read(layer=1) j2k.read(layer=1)
def test_basic_jp2(self): def test_basic_jp2(self):
# This test is only useful when openjp2 is not available """This test is only useful when openjp2 is not available
# and OPJ_DATA_ROOT is not set. We need at least one and OPJ_DATA_ROOT is not set. We need at least one
# working JP2 test. working JP2 test.
"""
j2k = Jp2k(self.jp2file) j2k = Jp2k(self.jp2file)
d = j2k.read(rlevel=1) j2k.read(rlevel=1)
def test_basic_j2k(self): def test_basic_j2k(self):
# This test is only useful when openjp2 is not available """This test is only useful when openjp2 is not available
# and OPJ_DATA_ROOT is not set. We need at least one and OPJ_DATA_ROOT is not set. We need at least one
# working J2K test. working J2K test.
"""
j2k = Jp2k(self.j2kfile) j2k = Jp2k(self.j2kfile)
d = j2k.read() j2k.read()
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -2,6 +2,7 @@
The tests defined here roughly correspond to what is in the OpenJPEG test The tests defined here roughly correspond to what is in the OpenJPEG test
suite. suite.
""" """
#pylint: disable-all
from contextlib import contextmanager from contextlib import contextmanager
import os import os

View file

@ -2,6 +2,7 @@
The tests here do not correspond directly to the OpenJPEG test suite, but The tests here do not correspond directly to the OpenJPEG test suite, but
seem like logical negative tests to add. seem like logical negative tests to add.
""" """
#pylint: disable-all
import os import os
import sys import sys
import tempfile import tempfile
@ -71,6 +72,7 @@ class TestSuiteNegative(unittest.TestCase):
def tearDown(self): def tearDown(self):
pass pass
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_negative_psnr_with_cratios(self): def test_negative_psnr_with_cratios(self):
# Using psnr with cratios options is not allowed. # Using psnr with cratios options is not allowed.
# Not an OpenJPEG test, but close. # Not an OpenJPEG test, but close.
@ -126,6 +128,7 @@ class TestSuiteNegative(unittest.TestCase):
# the end of SOT. # the end of SOT.
self.assertEqual(c.segment[-1].marker_id, 'SOD') self.assertEqual(c.segment[-1].marker_id, 'SOD')
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_code_block_dimensions(self): def test_code_block_dimensions(self):
# opj_compress doesn't allow the dimensions of a codeblock # opj_compress doesn't allow the dimensions of a codeblock
# to be too small or too big, so neither will we. # to be too small or too big, so neither will we.
@ -154,6 +157,7 @@ class TestSuiteNegative(unittest.TestCase):
with self.assertWarns(UserWarning) as cw: with self.assertWarns(UserWarning) as cw:
j = Jp2k(infile) j = Jp2k(infile)
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_precinct_size_not_multiple_of_two(self): def test_precinct_size_not_multiple_of_two(self):
# Seems like precinct sizes should be powers of two. # Seems like precinct sizes should be powers of two.
ifile = Jp2k(self.j2kfile) ifile = Jp2k(self.j2kfile)
@ -163,6 +167,7 @@ class TestSuiteNegative(unittest.TestCase):
with self.assertRaises(IOError) as ce: with self.assertRaises(IOError) as ce:
ofile.write(data, psizes=[(13, 13)]) ofile.write(data, psizes=[(13, 13)])
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_codeblock_size_not_multiple_of_two(self): def test_codeblock_size_not_multiple_of_two(self):
# Seems like code block sizes should be powers of two. # Seems like code block sizes should be powers of two.
ifile = Jp2k(self.j2kfile) ifile = Jp2k(self.j2kfile)
@ -172,6 +177,7 @@ class TestSuiteNegative(unittest.TestCase):
with self.assertRaises(IOError) as ce: with self.assertRaises(IOError) as ce:
ofile.write(data, cbsize=(13, 12)) ofile.write(data, cbsize=(13, 12))
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
def test_codeblock_size_with_precinct_size(self): def test_codeblock_size_with_precinct_size(self):
# Seems like code block sizes should never exceed half that of # Seems like code block sizes should never exceed half that of
# precinct size. # precinct size.

View file

@ -2,6 +2,7 @@
The tests defined here roughly correspond to what is in the OpenJPEG test The tests defined here roughly correspond to what is in the OpenJPEG test
suite. suite.
""" """
#pylint: disable-all
import os import os
import platform import platform
import sys import sys
@ -57,6 +58,7 @@ def read_image(infile):
return data return data
@unittest.skipIf(os.name == "nt", "no write support on windows, period")
@unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None, @unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None,
"Missing openjp2 library.") "Missing openjp2 library.")
@unittest.skipIf(no_read_backend, no_read_backend_msg) @unittest.skipIf(no_read_backend, no_read_backend_msg)

View file

@ -1,3 +1,4 @@
#pylint: disable-all
import os import os
import pkg_resources import pkg_resources
import struct import struct
@ -21,6 +22,7 @@ except:
raise raise
@unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
@unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None, @unittest.skipIf(glymur.lib.openjp2.OPENJP2 is None,
"Missing openjp2 library.") "Missing openjp2 library.")
class TestPrintingNeedsLib(unittest.TestCase): class TestPrintingNeedsLib(unittest.TestCase):
@ -782,8 +784,7 @@ class TestPrinting(unittest.TestCase):
expected = '\n'.join(lines) expected = '\n'.join(lines)
self.assertEqual(actual, expected) self.assertEqual(actual, expected)
@unittest.skipIf(os.name == "nt", @unittest.skipIf(os.name == "nt", "Temporary file issue on window.")
"Problems using NamedTemporaryFile on windows.")
def test_less_common_boxes(self): def test_less_common_boxes(self):
with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile:
with open(self.jp2file, 'rb') as ifile: with open(self.jp2file, 'rb') as ifile:

View file

@ -1,7 +1,11 @@
| OS | Python 2.7 | Python 3.3 | Notes | | OS | Python 2.7 | Python 3.3 | Notes |
+------------+------------+------------+--------------------------------------+ +------------+------------+------------+--------------------------------------+
| Windows | X | | Python(xy) with OpenJPEG 1.5.1. | | Windows | X | | Python(xy) with OpenJPEG 1.5.1. At |
| | | | At least 25 tests should pass | | | | | least 155 of 444 tests should pass. |
+------------+------------+------------+--------------------------------------+
| Windows | X | | Python(xy) with OpenJPEG 1.5.1 and |
| | | | OpenJPEG svn. At least 282 of 444 |
| | | | tests should pass. |
+------------+------------+------------+--------------------------------------+ +------------+------------+------------+--------------------------------------+
| Mac | X | | MacPorts with both OpenJPEG 1.5.1 | | Mac | X | | MacPorts with both OpenJPEG 1.5.1 |
| | | | and OpenJPEG svn. 370 of 450 tests | | | | | and OpenJPEG svn. 370 of 450 tests |