Negative tests for images with alpha layers.
This commit is contained in:
parent
028b297285
commit
c5f54704b4
3 changed files with 51 additions and 2 deletions
|
|
@ -74,6 +74,12 @@ _color_type_map_display = {
|
||||||
_PRE_MULTIPLIED_OPACITY: 'pre-multiplied opacity',
|
_PRE_MULTIPLIED_OPACITY: 'pre-multiplied opacity',
|
||||||
_UNSPECIFIED: 'unspecified'}
|
_UNSPECIFIED: 'unspecified'}
|
||||||
|
|
||||||
|
# color channel definitions.
|
||||||
|
RED = 1
|
||||||
|
GREEN = 2
|
||||||
|
BLUE = 3
|
||||||
|
GREY = 1
|
||||||
|
|
||||||
# enumerated color channel associations
|
# enumerated color channel associations
|
||||||
_rgb_colorspace = {"R": 1, "G": 2, "B": 3}
|
_rgb_colorspace = {"R": 1, "G": 2, "B": 3}
|
||||||
_greyscale_colorspace = {"Y": 1}
|
_greyscale_colorspace = {"Y": 1}
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,7 @@ import warnings
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from .codestream import Codestream
|
from .codestream import Codestream
|
||||||
from .core import progression_order
|
from .core import *
|
||||||
from .core import SRGB
|
|
||||||
from .jp2box import *
|
from .jp2box import *
|
||||||
from .lib import openjp2 as opj2
|
from .lib import openjp2 as opj2
|
||||||
|
|
||||||
|
|
@ -467,6 +466,7 @@ class Jp2k(Jp2kBox):
|
||||||
if len(colr_lst) == 0:
|
if len(colr_lst) == 0:
|
||||||
msg = "The jp2 header box must contain a color definition box."
|
msg = "The jp2 header box must contain a color definition box."
|
||||||
raise IOError(msg)
|
raise IOError(msg)
|
||||||
|
colr = jp2h.box[colr_lst[0]]
|
||||||
|
|
||||||
# Any cdef box must be in the jp2 header following the image header.
|
# Any cdef box must be in the jp2 header following the image header.
|
||||||
cdef_lst = [j for (j, box) in enumerate(boxes) if box.id == 'cdef']
|
cdef_lst = [j for (j, box) in enumerate(boxes) if box.id == 'cdef']
|
||||||
|
|
@ -480,6 +480,21 @@ class Jp2k(Jp2kBox):
|
||||||
msg = "Only one channel definition box is allowed in the "
|
msg = "Only one channel definition box is allowed in the "
|
||||||
msg += "JP2 header."
|
msg += "JP2 header."
|
||||||
raise IOError(msg)
|
raise IOError(msg)
|
||||||
|
elif len(cdef_lst) == 1:
|
||||||
|
cdef = jp2h.box[cdef_lst[0]]
|
||||||
|
assn = cdef.association
|
||||||
|
typ = cdef.channel_type
|
||||||
|
index = cdef.index
|
||||||
|
if colr.colorspace == SRGB:
|
||||||
|
if any([chan + 1 not in assn or typ[chan] != 0 for chan in [0, 1, 2]]):
|
||||||
|
msg = "All color channels must be defined in the "
|
||||||
|
msg += "channel definition box."
|
||||||
|
raise IOError(msg)
|
||||||
|
elif colr.colorspace == GREYSCALE:
|
||||||
|
if 0 not in typ:
|
||||||
|
msg = "All color channels must be defined in the "
|
||||||
|
msg += "channel definition box."
|
||||||
|
raise IOError(msg)
|
||||||
|
|
||||||
with open(filename, 'wb') as ofile:
|
with open(filename, 'wb') as ofile:
|
||||||
for box in boxes:
|
for box in boxes:
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,19 @@ class TestChannelDefinition(unittest.TestCase):
|
||||||
self.assertEqual(jp2h.box[2].channel_type, (0, 0, 0, 1))
|
self.assertEqual(jp2h.box[2].channel_type, (0, 0, 0, 1))
|
||||||
self.assertEqual(jp2h.box[2].association, (1, 2, 3, 0))
|
self.assertEqual(jp2h.box[2].association, (1, 2, 3, 0))
|
||||||
|
|
||||||
|
def test_bad_rgba(self):
|
||||||
|
"""R, G, and B must be specified."""
|
||||||
|
j2k = Jp2k(self.four_planes)
|
||||||
|
cdef = glymur.jp2box.ChannelDefinitionBox(index=[0, 1, 2, 3],
|
||||||
|
channel_type=[0, 0, 1, 1],
|
||||||
|
association=[1, 2, 3, 0])
|
||||||
|
boxes = [self.ihdr, self.colr_rgb, cdef]
|
||||||
|
self.jp2h.box = boxes
|
||||||
|
boxes = [self.jP, self.ftyp, self.jp2h, self.jp2c]
|
||||||
|
with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile:
|
||||||
|
with self.assertRaises(IOError) as ce:
|
||||||
|
j2k.wrap(tfile.name, boxes=boxes)
|
||||||
|
|
||||||
def test_grey(self):
|
def test_grey(self):
|
||||||
"""Just regular greyscale."""
|
"""Just regular greyscale."""
|
||||||
j2k = Jp2k(self.one_plane)
|
j2k = Jp2k(self.one_plane)
|
||||||
|
|
@ -151,6 +164,21 @@ class TestChannelDefinition(unittest.TestCase):
|
||||||
self.assertEqual(jp2h.box[2].channel_type, (0, 1))
|
self.assertEqual(jp2h.box[2].channel_type, (0, 1))
|
||||||
self.assertEqual(jp2h.box[2].association, (1, 0))
|
self.assertEqual(jp2h.box[2].association, (1, 0))
|
||||||
|
|
||||||
|
def test_bad_grey_alpha(self):
|
||||||
|
"""A greyscale image with alpha layer must specify Y"""
|
||||||
|
j2k = Jp2k(self.two_planes)
|
||||||
|
|
||||||
|
# This cdef box
|
||||||
|
cdef = glymur.jp2box.ChannelDefinitionBox(index=[0, 1],
|
||||||
|
channel_type=[1, 1],
|
||||||
|
association=[0, 1])
|
||||||
|
boxes = [self.ihdr, self.colr_gr, cdef]
|
||||||
|
self.jp2h.box = boxes
|
||||||
|
boxes = [self.jP, self.ftyp, self.jp2h, self.jp2c]
|
||||||
|
with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile:
|
||||||
|
with self.assertRaises((OSError, IOError)) as ce:
|
||||||
|
j2k.wrap(tfile.name, boxes=boxes)
|
||||||
|
|
||||||
def test_only_one_cdef_in_jp2_header(self):
|
def test_only_one_cdef_in_jp2_header(self):
|
||||||
"""There can only be one channel definition box in the jp2 header."""
|
"""There can only be one channel definition box in the jp2 header."""
|
||||||
j2k = Jp2k(self.j2kfile)
|
j2k = Jp2k(self.j2kfile)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue