')
assert__str__(tif)
###############################################################################
# Test TiffWriter
WRITE_DATA = numpy.arange(3 * 219 * 301).astype(numpy.uint16)
WRITE_DATA.shape = (3, 219, 301)
@pytest.mark.skipif(SKIP_EXTENDED, reason=REASON)
@pytest.mark.parametrize(
'shape',
[
(219, 301),
(219, 301, 2),
(219, 301, 3),
(219, 301, 4),
(2, 219, 301),
(3, 219, 301),
(4, 219, 301),
(5, 219, 301),
(4, 3, 219, 301),
(4, 219, 301, 3),
(3, 4, 219, 301),
(3, 4, 219, 301, 1),
],
)
@pytest.mark.parametrize('dtype', list('?bhiqefdBHIQFD'))
@pytest.mark.parametrize('byteorder', ['>', '<'])
@pytest.mark.parametrize('bigtiff', ['plaintiff', 'bigtiff'])
@pytest.mark.parametrize('tile', [None, (64, 64)])
@pytest.mark.parametrize('data', ['random', None])
def test_write(data, byteorder, bigtiff, dtype, shape, tile):
"""Test TiffWriter with various options."""
# TODO: test compression ?
fname = '{}_{}_{}_{}{}{}'.format(
bigtiff,
{'<': 'le', '>': 'be'}[byteorder],
numpy.dtype(dtype).name,
str(shape).replace(' ', ''),
'_tiled' if tile is not None else '',
'_empty' if data is None else '',
)
bigtiff = bigtiff == 'bigtiff'
if (3 in shape or 4 in shape) and shape[-1] != 1 and dtype != '?':
photometric = 'rgb'
else:
photometric = None
with TempFileName(fname) as fname:
if data is None:
with TiffWriter(
fname, byteorder=byteorder, bigtiff=bigtiff
) as tif:
if tile is not None or dtype == '?':
# cannot write non-contiguous empty file
with pytest.raises(ValueError):
tif.write(
shape=shape,
dtype=dtype,
tile=tile,
photometric=photometric,
)
return
else:
tif.write(
shape=shape,
dtype=dtype,
tile=tile,
photometric=photometric,
)
with TiffFile(fname) as tif:
assert__str__(tif)
image = tif.asarray()
else:
data = random_data(dtype, shape)
imwrite(
fname,
data,
byteorder=byteorder,
bigtiff=bigtiff,
tile=tile,
photometric=photometric,
)
image = imread(fname)
assert image.flags['C_CONTIGUOUS']
assert_array_equal(data.squeeze(), image.squeeze())
if not SKIP_ZARR:
with imread(fname, aszarr=True) as store:
data = zarr.open(store, mode='r')
assert_array_equal(data, image)
assert shape == image.shape
assert dtype == image.dtype
if not bigtiff:
assert_valid_tiff(fname)
@pytest.mark.skipif(SKIP_PUBLIC or SKIP_CODECS, reason=REASON)
@pytest.mark.parametrize('tile', [False, True])
@pytest.mark.parametrize(
'codec',
[
'deflate',
'lzma',
'packbits',
'zstd', # TODO: 'lzw'
'webp',
'png',
'jpeg',
'jpegxl',
'jpegxr',
'jpeg2000',
],
)
@pytest.mark.parametrize('mode', ['gray', 'rgb', 'planar'])
def test_write_codecs(mode, tile, codec):
"""Test write various compression."""
if mode in ('gray', 'planar') and codec == 'webp':
pytest.xfail("WebP doesn't support grayscale or planar mode")
level = {'webp': -1, 'jpeg': 99}.get(codec, None)
tile = (16, 16) if tile else None
data = numpy.load(public_file('tifffile/rgb.u1.npy'))
if mode == 'rgb':
photometric = RGB
planarconfig = CONTIG
elif mode == 'planar':
photometric = RGB
planarconfig = SEPARATE
data = numpy.moveaxis(data, -1, 0).copy()
else:
planarconfig = None
photometric = MINISBLACK
data = data[..., :1].copy()
data = numpy.repeat(data[numpy.newaxis], 3, axis=0)
data[1] = 255 - data[1]
shape = data.shape
with TempFileName(
'codecs_{}_{}{}'.format(mode, codec, '_tile' if tile else '')
) as fname:
imwrite(
fname,
data,
compression=(codec, level),
tile=tile,
photometric=photometric,
planarconfig=planarconfig,
subsampling=(1, 1),
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == shape[0]
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == enumarg(TIFF.COMPRESSION, codec)
assert page.photometric in (photometric, YCBCR)
if planarconfig is not None:
assert page.planarconfig == planarconfig
assert page.imagewidth == 31
assert page.imagelength == 32
assert page.samplesperpixel == 1 if mode == 'gray' else 3
# samplesperpixel = page.samplesperpixel
image = tif.asarray()
if codec in ('jpeg',):
assert_allclose(data, image, atol=10)
else:
assert_array_equal(data, image)
assert_decode_method(page)
assert__str__(tif)
if (
imagecodecs.TIFF
and codec not in ('png', 'jpegxr', 'jpeg2000', 'jpegxl')
and mode != 'planar'
):
im = imagecodecs.imread(fname, index=None)
# if codec == 'jpeg':
# # tiff_decode returns JPEG compressed TIFF as RGBA
# im = numpy.squeeze(im[..., :samplesperpixel])
assert_array_equal(im, numpy.squeeze(image))
@pytest.mark.skipif(SKIP_PUBLIC, reason=REASON)
@pytest.mark.parametrize('mode', ['gray', 'rgb', 'planar'])
@pytest.mark.parametrize('tile', [False, True])
@pytest.mark.parametrize(
'dtype', ['u1', 'u2', 'u4', 'i1', 'i2', 'i4', 'f2', 'f4', 'f8']
)
@pytest.mark.parametrize('byteorder', ['>', '<'])
def test_write_predictor(byteorder, dtype, tile, mode):
"""Test predictors."""
tile = (32, 32) if tile else None
f4 = imread(public_file('tifffile/gray.f4.tif'))
if mode == 'rgb':
photometric = RGB
planarconfig = CONTIG
data = numpy.empty((83, 111, 3), 'f4')
data[..., 0] = f4
data[..., 1] = f4[::-1]
data[..., 2] = f4[::-1, ::-1]
elif mode == 'planar':
photometric = RGB
planarconfig = SEPARATE
data = numpy.empty((3, 83, 111), 'f4')
data[0] = f4
data[1] = f4[::-1]
data[2] = f4[::-1, ::-1]
else:
planarconfig = None
photometric = MINISBLACK
data = f4
if dtype[0] in 'if':
data -= 0.5
if dtype in 'u1i1':
data *= 255
elif dtype in 'i2u2':
data *= 2**12
elif dtype in 'i4u4':
data *= 2**21
else:
data *= 3.145
data = data.astype(byteorder + dtype)
with TempFileName(
'predictor_{}_{}_{}{}'.format(
dtype,
'be' if byteorder == '>' else 'le',
mode,
'_tile' if tile else '',
)
) as fname:
imwrite(
fname,
data,
predictor=True,
compression=ADOBE_DEFLATE,
tile=tile,
photometric=photometric,
planarconfig=planarconfig,
byteorder=byteorder,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert tif.tiff.byteorder == byteorder
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == ADOBE_DEFLATE
assert page.predictor == (3 if dtype[0] == 'f' else 2)
assert page.photometric == photometric
if planarconfig is not None:
assert page.planarconfig == planarconfig
assert page.imagewidth == 111
assert page.imagelength == 83
assert page.samplesperpixel == 1 if mode == 'gray' else 3
# samplesperpixel = page.samplesperpixel
image = tif.asarray()
assert_array_equal(data, image)
assert_decode_method(page)
assert__str__(tif)
if imagecodecs.TIFF:
im = imagecodecs.imread(fname, index=None)
assert_array_equal(im, numpy.squeeze(image))
@pytest.mark.parametrize('bytecount', [16, 256])
@pytest.mark.parametrize('count', [1, 2, 4])
@pytest.mark.parametrize('compression', [0, 6])
@pytest.mark.parametrize('tiled', [0, 1])
@pytest.mark.parametrize('bigtiff', [0, 1])
def test_write_bytecount(bigtiff, tiled, compression, count, bytecount):
"""Test write bytecount formats."""
if tiled:
tag = 'TileByteCounts'
rowsperstrip = None
tile = (bytecount, bytecount)
shape = {
1: (bytecount, bytecount),
2: (bytecount * 2, bytecount),
4: (bytecount * 2, bytecount * 2),
}[count]
else:
tag = 'StripByteCounts'
tile = None
rowsperstrip = bytecount
shape = (bytecount * count, bytecount)
data = random_data(numpy.uint8, shape)
if count == 1:
dtype = TIFF.DATATYPES.LONG8 if bigtiff else TIFF.DATATYPES.LONG
elif bytecount == 256:
dtype = TIFF.DATATYPES.LONG
else:
dtype = TIFF.DATATYPES.SHORT
with TempFileName(
'bytecounts_{}{}{}{}{}'.format(
bigtiff, tiled, compression, count, bytecount
)
) as fname:
imwrite(
fname,
data,
bigtiff=bigtiff,
tile=tile,
compression=(ADOBE_DEFLATE, compression)
if compression
else compression,
rowsperstrip=rowsperstrip,
)
if not bigtiff:
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.tags[tag].count == count
assert page.tags[tag].dtype == dtype
assert page.is_contiguous != bool(compression)
assert page.planarconfig == CONTIG
assert page.photometric == MINISBLACK
assert page.imagewidth == shape[1]
assert page.imagelength == shape[0]
assert page.samplesperpixel == 1
assert_array_equal(page.asarray(), data)
assert_aszarr_method(page, data)
assert__str__(tif)
@pytest.mark.skipif(SKIP_EXTENDED, reason=REASON)
@pytest.mark.parametrize('repeat', [1, 4])
@pytest.mark.parametrize('shape', [(1, 0), (0, 1), (3, 0, 2, 1)])
@pytest.mark.parametrize('data', ['random', 'empty'])
@pytest.mark.parametrize('shaped', [True, False])
def test_write_zeroshape(shaped, data, repeat, shape):
"""Test write arrays with zero shape."""
dtype = numpy.uint8
fname = 'shape_{}x{}{}{}'.format(
repeat,
str(shape).replace(' ', ''),
'_shaped' if shaped else '',
'_empty' if data == 'empty' else '',
)
metadata = {} if shaped else None
with TempFileName(fname) as fname:
if data == 'empty':
with TiffWriter(fname) as tif:
with pytest.warns(UserWarning):
for _ in range(repeat):
tif.write(
shape=shape,
dtype=dtype,
contiguous=True,
metadata=metadata,
)
tif.write(numpy.zeros((16, 16), 'u2'), metadata=metadata)
with TiffFile(fname) as tif:
assert__str__(tif)
image = zimage = tif.asarray()
if not SKIP_ZARR:
zimage = zarr.open(tif.aszarr(), mode='r')
else:
data = random_data(dtype, shape)
with TiffWriter(fname) as tif:
with pytest.warns(UserWarning):
for _ in range(repeat):
tif.write(data, contiguous=True, metadata=metadata)
tif.write(numpy.zeros((16, 16), 'u2'), metadata=metadata)
with TiffFile(fname) as tif:
assert__str__(tif)
image = zimage = tif.asarray()
if not SKIP_ZARR:
zimage = zarr.open(tif.aszarr(), mode='r')
assert image.flags['C_CONTIGUOUS']
if shaped:
if repeat > 1:
for i in range(repeat):
assert_array_equal(image[i], data)
assert_array_equal(zimage[i], data)
else:
assert_array_equal(image, data)
assert_array_equal(zimage, data)
else:
empty = numpy.empty((0, 0), dtype)
if repeat > 1:
for i in range(repeat):
assert_array_equal(image[i], empty)
assert_array_equal(zimage[i], empty)
else:
assert_array_equal(image.squeeze(), empty)
# assert_array_equal(zimage.squeeze(), empty)
if repeat > 1:
assert image.shape[0] == repeat
assert zimage.shape[0] == repeat
elif shaped:
assert shape == image.shape
assert shape == zimage.shape
else:
assert image.shape == (0, 0)
assert zimage.shape == (0, 0)
assert dtype == image.dtype
assert dtype == zimage.dtype
@pytest.mark.parametrize('repeats', [1, 2])
@pytest.mark.parametrize('series', [1, 2])
@pytest.mark.parametrize('subifds', [0, 1, 2])
@pytest.mark.parametrize('compressed', [False, True])
@pytest.mark.parametrize('tiled', [False, True])
@pytest.mark.parametrize('ome', [False, True])
def test_write_subidfs(ome, tiled, compressed, series, repeats, subifds):
"""Test writing SubIFDs."""
if repeats > 1 and (compressed or tiled or ome):
pytest.xfail('contiguous not working with compression, tiles, ome')
data = [
(numpy.random.rand(5, 64, 64) * 1023).astype(numpy.uint16),
(numpy.random.rand(5, 32, 32) * 1023).astype(numpy.uint16),
(numpy.random.rand(5, 16, 16) * 1023).astype(numpy.uint16),
]
kwargs = {
'tile': (16, 16) if tiled else None,
'compression': (ADOBE_DEFLATE, 6) if compressed else None,
}
with TempFileName(
'write_subidfs_'
f'{ome}-{tiled}-{compressed}-{subifds}-{series}-{repeats}'
) as fname:
with TiffWriter(fname, ome=ome) as tif:
for _ in range(series):
for r in range(repeats):
kwargs['contiguous'] = r != 0
tif.write(data[0], subifds=subifds, **kwargs)
for i in range(1, subifds + 1):
for r in range(repeats):
kwargs['contiguous'] = r != 0
tif.write(data[i], subfiletype=1, **kwargs)
with TiffFile(fname) as tif:
for i, page in enumerate(tif.pages):
if i % (5 * repeats):
assert page.description == ''
elif ome:
if i == 0:
assert page.is_ome
else:
assert page.description == ''
else:
assert page.is_shaped
assert_array_equal(page.asarray(), data[0][i % 5])
assert_aszarr_method(page, data[0][i % 5])
assert len(page.pages) == subifds
for j, subifd in enumerate(page.pages):
assert_array_equal(subifd.asarray(), data[j + 1][i % 5])
assert_aszarr_method(subifd, data[j + 1][i % 5])
for i, page in enumerate(tif.pages[:-1]):
assert page._nextifd() == tif.pages[i + 1].offset
if subifds:
for j, subifd in enumerate(page.pages[:-1]):
assert subifd.subfiletype == 1
assert subifd._nextifd() == page.subifds[j + 1]
assert page.pages[-1]._nextifd() == 0
assert len(tif.series) == series
if repeats > 1:
for s in range(series):
assert tif.series[s].kind == 'OME' if ome else 'Shaped'
assert_array_equal(tif.series[s].asarray()[0], data[0])
for i in range(subifds):
assert_array_equal(
tif.series[s].levels[i + 1].asarray()[0],
data[i + 1],
)
else:
for s in range(series):
assert tif.series[s].kind == 'OME' if ome else 'Shaped'
assert_array_equal(tif.series[s].asarray(), data[0])
for i in range(subifds):
assert_array_equal(
tif.series[s].levels[i + 1].asarray(), data[i + 1]
)
def test_write_lists():
"""Test write lists."""
array = numpy.arange(1000).reshape(10, 10, 10).astype(numpy.uint16)
data = array.tolist()
with TempFileName('write_lists') as fname:
with TiffWriter(fname) as tif:
tif.write(data, dtype=numpy.uint16)
tif.write(data, compression=ADOBE_DEFLATE)
tif.write([100.0])
with pytest.warns(UserWarning):
tif.write([])
with TiffFile(fname) as tif:
assert_array_equal(tif.series[0].asarray(), array)
assert_array_equal(tif.series[1].asarray(), array)
assert_array_equal(tif.series[2].asarray(), [100.0])
assert_array_equal(tif.series[3].asarray(), [])
assert_aszarr_method(tif.series[0], array)
assert_aszarr_method(tif.series[1], array)
assert_aszarr_method(tif.series[2], [100.0])
# assert_aszarr_method(tif.series[3], [])
def test_write_nopages():
"""Test write TIFF with no pages."""
with TempFileName('nopages') as fname:
with TiffWriter(fname) as tif:
pass
with TiffFile(fname) as tif:
assert len(tif.pages) == 0
tif.asarray()
if not SKIP_VALIDATE:
with pytest.raises(ValueError):
assert_valid_tiff(fname)
def test_write_append_not_exists():
"""Test append to non existing file."""
with TempFileName('append_not_exists.bin') as fname:
# with self.assertRaises(ValueError):
with TiffWriter(fname, append=True):
pass
def test_write_append_nontif():
"""Test fail to append to non-TIFF file."""
with TempFileName('append_nontif.bin') as fname:
with open(fname, 'wb') as fh:
fh.write(b'not a TIFF file')
with pytest.raises(TiffFileError):
with TiffWriter(fname, append=True):
pass
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_write_append_lsm():
"""Test fail to append to LSM file."""
fname = private_file('lsm/take1.lsm')
with pytest.raises(ValueError):
with TiffWriter(fname, append=True):
pass
def test_write_append_imwrite():
"""Test append using imwrite."""
data = random_data(numpy.uint8, (21, 31))
with TempFileName('imwrite_append') as fname:
imwrite(fname, data, metadata=None)
for _ in range(3):
imwrite(fname, data, append=True, metadata=None)
a = imread(fname)
assert a.shape == (4, 21, 31)
assert_array_equal(a[3], data)
def test_write_append():
"""Test append to existing TIFF file."""
data = random_data(numpy.uint8, (21, 31))
with TempFileName('append') as fname:
with TiffWriter(fname) as tif:
pass
with TiffFile(fname) as tif:
assert len(tif.pages) == 0
assert__str__(tif)
with TiffWriter(fname, append=True) as tif:
tif.write(data)
with TiffFile(fname) as tif:
assert len(tif.series) == 1
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.imagewidth == 31
assert page.imagelength == 21
assert__str__(tif)
with TiffWriter(fname, append=True) as tif:
tif.write(data)
tif.write(data, contiguous=True)
with TiffFile(fname) as tif:
assert len(tif.series) == 2
assert len(tif.pages) == 3
page = tif.pages[0]
assert page.imagewidth == 31
assert page.imagelength == 21
assert_array_equal(tif.asarray(series=1)[1], data)
assert__str__(tif)
assert_valid_tiff(fname)
def test_write_append_bytesio():
"""Test append to existing TIFF file in BytesIO."""
data = random_data(numpy.uint8, (21, 31))
offset = 11
file = BytesIO()
file.write(b'a' * offset)
with TiffWriter(file) as tif:
pass
file.seek(offset)
with TiffFile(file) as tif:
assert len(tif.pages) == 0
file.seek(offset)
with TiffWriter(file, append=True) as tif:
tif.write(data)
file.seek(offset)
with TiffFile(file) as tif:
assert len(tif.series) == 1
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.imagewidth == 31
assert page.imagelength == 21
assert__str__(tif)
file.seek(offset)
with TiffWriter(file, append=True) as tif:
tif.write(data)
tif.write(data, contiguous=True)
file.seek(offset)
with TiffFile(file) as tif:
assert len(tif.series) == 2
assert len(tif.pages) == 3
page = tif.pages[0]
assert page.imagewidth == 31
assert page.imagelength == 21
assert_array_equal(tif.asarray(series=1)[1], data)
assert__str__(tif)
@pytest.mark.skipif(SKIP_PUBLIC or SKIP_CODECS, reason=REASON)
def test_write_roundtrip_filename():
"""Test write and read using file name."""
data = imread(public_file('tifffile/generic_series.tif'))
with TempFileName('roundtrip_filename') as fname:
imwrite(fname, data, photometric=RGB)
assert_array_equal(imread(fname), data)
@pytest.mark.skipif(SKIP_PUBLIC or SKIP_CODECS, reason=REASON)
def test_write_roundtrip_openfile():
"""Test write and read using open file."""
pad = b'0' * 7
data = imread(public_file('tifffile/generic_series.tif'))
with TempFileName('roundtrip_openfile') as fname:
with open(fname, 'wb') as fh:
fh.write(pad)
imwrite(fh, data, photometric=RGB)
fh.write(pad)
with open(fname, 'rb') as fh:
fh.seek(len(pad))
assert_array_equal(imread(fh), data)
@pytest.mark.skipif(SKIP_PUBLIC or SKIP_CODECS, reason=REASON)
def test_write_roundtrip_bytesio():
"""Test write and read using BytesIO."""
pad = b'0' * 7
data = imread(public_file('tifffile/generic_series.tif'))
buf = BytesIO()
buf.write(pad)
imwrite(buf, data, photometric=RGB)
buf.write(pad)
buf.seek(len(pad))
assert_array_equal(imread(buf), data)
def test_write_pages():
"""Test write tags for contiguous data in all pages."""
data = random_data(numpy.float32, (17, 219, 301))
with TempFileName('pages') as fname:
imwrite(fname, data, photometric=MINISBLACK)
assert_valid_tiff(fname)
# assert file
with TiffFile(fname) as tif:
assert len(tif.pages) == 17
for i, page in enumerate(tif.pages):
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == MINISBLACK
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
image = page.asarray()
assert_array_equal(data[i], image)
# assert series
series = tif.series[0]
assert series.offset is not None
image = series.asarray()
assert_array_equal(data, image)
assert__str__(tif)
def test_write_truncate():
"""Test only one page is written for truncated files."""
shape = (4, 5, 6, 1)
with TempFileName('truncate') as fname:
imwrite(fname, random_data(numpy.uint8, shape), truncate=True)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1 # not 4
page = tif.pages[0]
assert page.is_shaped
assert page.shape == (5, 6)
assert '"shape": [4, 5, 6, 1]' in page.description
assert '"truncated": true' in page.description
series = tif.series[0]
assert series.shape == shape
assert len(series._pages) == 1
assert len(series.pages) == 1
data = tif.asarray()
assert data.shape == shape
assert_aszarr_method(tif, data)
assert_aszarr_method(tif, data, chunkmode='page')
assert__str__(tif)
def test_write_is_shaped():
"""Test files are written with shape."""
with TempFileName('is_shaped') as fname:
imwrite(fname, random_data(numpy.uint8, (4, 5, 6, 3)), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 4
page = tif.pages[0]
assert page.is_shaped
assert page.description == '{"shape": [4, 5, 6, 3]}'
assert__str__(tif)
with TempFileName('is_shaped_with_description') as fname:
descr = 'test is_shaped_with_description'
imwrite(
fname,
random_data(numpy.uint8, (5, 6, 3)),
photometric=RGB,
description=descr,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_shaped
assert page.description == descr
assert_aszarr_method(page)
assert_aszarr_method(page, chunkmode='page')
assert__str__(tif)
def test_write_bytes_str():
"""Test write bytes in place of 7-bit ascii string."""
micron = 'micron \xB5'.encode('latin-1') # can't be encoded as 7-bit ascii
data = numpy.arange(4, dtype=numpy.uint32).reshape((2, 2))
with TempFileName('write_bytes_str') as fname:
imwrite(
fname,
data,
description=micron,
software=micron,
extratags=[(50001, 's', 8, micron, True)],
)
with TiffFile(fname) as tif:
page = tif.pages[0]
assert page.description == 'micron \xB5'
assert page.software == 'micron \xB5'
assert page.tags[50001].value == 'micron \xB5'
def test_write_extratags():
"""Test write extratags."""
data = random_data(numpy.uint8, (2, 219, 301))
description = 'Created by TestTiffWriter\nLorem ipsum dolor...'
pagename = 'Page name'
extratags = [
(270, 's', 0, description, True),
('PageName', 's', 0, pagename, False),
(50001, 'b', 1, b'1', True),
(50002, 'b', 2, b'12', True),
(50004, 'b', 4, b'1234', True),
(50008, 'B', 8, b'12345678', True),
]
with TempFileName('extratags') as fname:
imwrite(fname, data, extratags=extratags)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert tif.pages[0].description1 == description
assert 'ImageDescription' not in tif.pages[1].tags
assert tif.pages[0].tags['PageName'].value == pagename
assert tif.pages[1].tags['PageName'].value == pagename
assert '50001' not in tif.pages[1].tags
tags = tif.pages[0].tags
assert tags['50001'].value == 49
assert tags['50002'].value == (49, 50)
assert tags['50004'].value == (49, 50, 51, 52)
assert_array_equal(tags['50008'].value, b'12345678')
# (49, 50, 51, 52, 53, 54, 55, 56))
assert__str__(tif)
def test_write_double_tags():
"""Test write single and sequences of doubles."""
# older versions of tifffile do not use offset to write doubles
# reported by Eric Prestat on Feb 21, 2016
data = random_data(numpy.uint8, (8, 8))
value = math.pi
extratags = [
(34563, 'd', 1, value, False),
(34564, 'd', 1, (value,), False),
(34565, 'd', 2, (value, value), False),
(34566, 'd', 2, [value, value], False),
(34567, 'd', 2, numpy.array((value, value)), False),
]
with TempFileName('double_tags') as fname:
imwrite(fname, data, extratags=extratags)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
tags = tif.pages[0].tags
assert tags['34563'].value == value
assert tags['34564'].value == value
assert tuple(tags['34565'].value) == (value, value)
assert tuple(tags['34566'].value) == (value, value)
assert tuple(tags['34567'].value) == (value, value)
assert__str__(tif)
with TempFileName('double_tags_bigtiff') as fname:
imwrite(fname, data, bigtiff=True, extratags=extratags)
# assert_jhove(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
tags = tif.pages[0].tags
assert tags['34563'].value == value
assert tags['34564'].value == value
assert tuple(tags['34565'].value) == (value, value)
assert tuple(tags['34566'].value) == (value, value)
assert tuple(tags['34567'].value) == (value, value)
assert__str__(tif)
def test_write_short_tags():
"""Test write single and sequences of words."""
data = random_data(numpy.uint8, (8, 8))
value = 65531
extratags = [
(34564, 'H', 1, (value,) * 1, False),
(34565, 'H', 2, (value,) * 2, False),
(34566, 'H', 3, (value,) * 3, False),
(34567, 'H', 4, (value,) * 4, False),
]
with TempFileName('short_tags') as fname:
imwrite(fname, data, extratags=extratags)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
tags = tif.pages[0].tags
assert tags['34564'].value == value
assert tuple(tags['34565'].value) == (value,) * 2
assert tuple(tags['34566'].value) == (value,) * 3
assert tuple(tags['34567'].value) == (value,) * 4
assert__str__(tif)
@pytest.mark.parametrize('subfiletype', [0b1, 0b10, 0b100, 0b1000, 0b1111])
def test_write_subfiletype(subfiletype):
"""Test write subfiletype."""
data = random_data(numpy.uint8, (16, 16))
if subfiletype & 0b100:
data = data.astype('bool')
with TempFileName(f'subfiletype_{subfiletype}') as fname:
imwrite(fname, data, subfiletype=subfiletype)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
page = tif.pages[0]
assert page.subfiletype == subfiletype
assert page.is_reduced == subfiletype & 0b1
assert page.is_multipage == subfiletype & 0b10
assert page.is_mask == subfiletype & 0b100
assert page.is_mrc == subfiletype & 0b1000
assert_array_equal(data, page.asarray())
assert__str__(tif)
@pytest.mark.parametrize('dt', [None, True, datetime, '2019:01:30 04:05:37'])
def test_write_datetime_tag(dt):
"""Test write datetime tag."""
arg = dt
if dt is datetime:
arg = datetime.datetime.now()
data = random_data(numpy.uint8, (31, 32))
with TempFileName('datetime') as fname:
imwrite(fname, data, datetime=arg)
with TiffFile(fname) as tif:
if dt is None:
assert 'DateTime' not in tif.pages[0].tags
elif dt is True:
assert (
tif.pages[0]
.tags['DateTime']
.value.startswith(
datetime.datetime.now().strftime('%Y:%m:%d %H:')
)
)
elif dt is datetime:
assert tif.pages[0].tags['DateTime'].value == arg.strftime(
'%Y:%m:%d %H:%M:%S'
)
else:
assert tif.pages[0].tags['DateTime'].value == dt
assert__str__(tif)
def test_write_description_tag():
"""Test write two description tags."""
data = random_data(numpy.uint8, (2, 219, 301))
description = 'Created by TestTiffWriter\nLorem ipsum dolor...'
with TempFileName('description_tag') as fname:
imwrite(fname, data, description=description)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert tif.pages[0].description == description
assert tif.pages[0].description1 == '{"shape": [2, 219, 301]}'
assert 'ImageDescription' not in tif.pages[1].tags
assert__str__(tif)
def test_write_description_tag_nojson():
"""Test no JSON description is written with metatata=None."""
data = random_data(numpy.uint8, (2, 219, 301))
description = 'Created by TestTiffWriter\nLorem ipsum dolor...'
with TempFileName('description_tag_nojson') as fname:
imwrite(fname, data, description=description, metadata=None)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert tif.pages[0].description == description
assert 'ImageDescription' not in tif.pages[1].tags
assert 'ImageDescription1' not in tif.pages[0].tags
assert__str__(tif)
def test_write_software_tag():
"""Test write Software tag."""
data = random_data(numpy.uint8, (2, 219, 301))
software = 'test_tifffile.py'
with TempFileName('software_tag') as fname:
imwrite(fname, data, software=software)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert tif.pages[0].software == software
assert 'Software' not in tif.pages[1].tags
assert__str__(tif)
def test_write_resolution_float():
"""Test write float Resolution tag."""
data = random_data(numpy.uint8, (2, 219, 301))
resolution = (92.0, 92.0)
with TempFileName('resolution_float') as fname:
imwrite(fname, data, resolution=resolution)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert tif.pages[0].tags['XResolution'].value == (92, 1)
assert tif.pages[0].tags['YResolution'].value == (92, 1)
assert tif.pages[1].tags['XResolution'].value == (92, 1)
assert tif.pages[1].tags['YResolution'].value == (92, 1)
assert__str__(tif)
def test_write_resolution_rational():
"""Test write rational Resolution tag."""
data = random_data(numpy.uint8, (1, 219, 301))
resolution = ((300, 1), (300, 1))
with TempFileName('resolution_rational') as fname:
imwrite(fname, data, resolution=resolution)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
assert tif.pages[0].tags['XResolution'].value == (300, 1)
assert tif.pages[0].tags['YResolution'].value == (300, 1)
def test_write_resolution_unit():
"""Test write Resolution tag unit."""
data = random_data(numpy.uint8, (219, 301))
resolution = (92.0, (9200, 100), None)
with TempFileName('resolution_unit') as fname:
imwrite(fname, data, resolution=resolution)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
assert tif.pages[0].tags['XResolution'].value == (92, 1)
assert tif.pages[0].tags['YResolution'].value == (92, 1)
assert tif.pages[0].tags['ResolutionUnit'].value == 1
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
@pytest.mark.parametrize('bps', [1, 2, 7, 8])
@pytest.mark.parametrize('dtype', [numpy.uint8, numpy.uint16, numpy.uint32])
def test_write_bitspersample(bps, dtype):
"""Test write with packints."""
dtype = numpy.dtype(dtype)
bps += (dtype.itemsize // 2) * 8
data = numpy.arange(256 * 256 * 3, dtype=dtype).reshape((256, 256, 3))
with TempFileName(f'write_bitspersample_{dtype.char}{bps}') as fname:
# TODO: enable all cases once imagecodecs.packints_encode works
if bps == dtype.itemsize * 8:
imwrite(fname, data, bitspersample=bps, photometric=RGB)
assert_array_equal(imread(fname), data)
else:
with pytest.raises(NotImplementedError):
imwrite(fname, data, bitspersample=bps, photometric=RGB)
assert_array_equal(imread(fname), data)
def test_write_bitspersample_fail():
"""Test write with packints fails."""
data = numpy.arange(32 * 32 * 3, dtype=numpy.uint32).reshape((32, 32, 3))
with TempFileName('write_bitspersample_fail') as fname:
with TiffWriter(fname) as tif:
# not working with compression
with pytest.raises(ValueError):
tif.write(
data.astype(numpy.uint8),
bitspersample=4,
compression=ADOBE_DEFLATE,
photometric=RGB,
)
# dtype.itemsize != bitspersample
for dtype in (
numpy.int8,
numpy.int16,
numpy.float32,
numpy.uint64,
):
with pytest.raises(ValueError):
tif.write(
data.astype(dtype), bitspersample=4, photometric=RGB
)
# bitspersample out of data range
for bps in (0, 9, 16, 32):
with pytest.raises(ValueError):
tif.write(
data.astype(numpy.uint8),
bitspersample=bps,
photometric=RGB,
)
for bps in (1, 8, 17, 32):
with pytest.raises(ValueError):
tif.write(
data.astype(numpy.uint16),
bitspersample=bps,
photometric=RGB,
)
for bps in (1, 8, 16, 33, 64):
with pytest.raises(ValueError):
tif.write(
data.astype(numpy.uint32),
bitspersample=bps,
photometric=RGB,
)
@pytest.mark.parametrize('kind', ['enum', 'int', 'lower', 'upper'])
def test_write_enum_parameters(kind):
"""Test imwrite using different kind of enum"""
data = random_data(numpy.uint8, (2, 6, 219, 301))
with TempFileName(f'enum_parameters_{kind}') as fname:
if kind == 'enum':
imwrite(
fname,
data,
photometric=RGB,
planarconfig=SEPARATE,
extrasamples=(ASSOCALPHA, UNSPECIFIED, UNASSALPHA),
compression=ADOBE_DEFLATE,
predictor=HORIZONTAL,
)
elif kind == 'int':
imwrite(
fname,
data,
photometric=2,
planarconfig=2,
extrasamples=(1, 0, 2),
compression=8,
predictor=2,
)
elif kind == 'upper':
imwrite(
fname,
data,
photometric='RGB',
planarconfig='SEPARATE',
extrasamples=('ASSOCALPHA', 'UNSPECIFIED', 'UNASSALPHA'),
compression='ADOBE_DEFLATE',
predictor='HORIZONTAL',
)
elif kind == 'lower':
imwrite(
fname,
data,
photometric='rgb',
planarconfig='separate',
extrasamples=('assocalpha', 'unspecified', 'unassalpha'),
compression='adobe_deflate',
predictor='horizontal',
)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
page = tif.pages[0]
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 6
assert page.photometric == RGB
assert page.planarconfig == SEPARATE
assert page.extrasamples == (ASSOCALPHA, UNSPECIFIED, UNASSALPHA)
assert page.compression == ADOBE_DEFLATE
assert page.predictor == HORIZONTAL
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.parametrize(
'args',
[
(0, 0),
(1, 1),
(2, NONE),
(3, ADOBE_DEFLATE),
(4, 'zlib'),
(5, 'zlib', 5),
(6, 'zlib', 5, {'out': None}),
(7, 'zlib', None, {'level': 5}),
],
)
def test_write_compression_args(args):
"""Test compression parameter."""
i = args[0]
compressionargs = args[1:]
compressed = compressionargs[0] not in (0, 1, NONE)
if len(compressionargs) == 1:
compressionargs = compressionargs[0]
data = WRITE_DATA
with TempFileName(f'compression_args_{i}') as fname:
imwrite(fname, data, compression=compressionargs, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.compression == (ADOBE_DEFLATE if compressed else NONE)
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == (9 if compressed else 3)
image = tif.asarray()
assert_array_equal(data, image)
assert__str__(tif)
@pytest.mark.parametrize(
'args', [(0, 0), (1, 5), (2, ADOBE_DEFLATE), (3, ADOBE_DEFLATE, 5)]
)
def test_write_compress_args(args):
"""Test deprecated compress parameter."""
i = args[0]
compressargs = args[1:]
compressed = compressargs[0] != 0
if len(compressargs) == 1:
compressargs = compressargs[0]
data = WRITE_DATA
with TempFileName(f'compression_args_{i}') as fname:
with pytest.warns(DeprecationWarning):
imwrite(fname, data, compress=compressargs, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.compression == (ADOBE_DEFLATE if compressed else NONE)
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == (9 if compressed else 3)
image = tif.asarray()
assert_array_equal(data, image)
assert__str__(tif)
def test_write_compression_none():
"""Test write compression=0."""
data = WRITE_DATA
with TempFileName('compression_none') as fname:
imwrite(fname, data, compression=0, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.compression == NONE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
# @pytest.mark.parametrize('optimize', [None, False, True])
# @pytest.mark.parametrize('smoothing', [None, 10])
@pytest.mark.skipif(
SKIP_PUBLIC or SKIP_CODECS or not imagecodecs.JPEG, reason=REASON
)
@pytest.mark.parametrize('subsampling', ['444', '422', '420', '411'])
@pytest.mark.parametrize('dtype', [numpy.uint8, numpy.uint16])
def test_write_compression_jpeg(dtype, subsampling):
"""Test write JPEG compression with subsampling."""
dtype = numpy.dtype(dtype)
filename = f'compression_jpeg_{dtype}_{subsampling}'
subsampling, atol = {
'444': [(1, 1), 5],
'422': [(2, 1), 10],
'420': [(2, 2), 20],
'411': [(4, 1), 40],
}[subsampling]
data = numpy.load(public_file('tifffile/rgb.u1.npy')).astype(dtype)
data = data[:32, :16].copy() # make divisable by subsamples
with TempFileName(filename) as fname:
imwrite(
fname,
data,
compression=(JPEG, 99),
subsampling=subsampling,
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
if subsampling[0] > 1:
assert page.is_subsampled
assert page.tags['YCbCrSubSampling'].value == subsampling
assert page.compression == JPEG
assert page.photometric == YCBCR
assert page.imagewidth == data.shape[1]
assert page.imagelength == data.shape[0]
assert page.samplesperpixel == 3
image = tif.asarray()
assert_allclose(data, image, atol=atol)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_compression_deflate():
"""Test write ZLIB compression."""
data = WRITE_DATA
with TempFileName('compression_deflate') as fname:
imwrite(fname, data, compression=(DEFLATE, 6), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == DEFLATE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert page.rowsperstrip == 108
assert len(page.dataoffsets) == 9
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_compression_deflate_level():
"""Test write ZLIB compression with level."""
data = WRITE_DATA
with TempFileName('compression_deflate_level') as fname:
imwrite(fname, data, compression=(ADOBE_DEFLATE, 9), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == ADOBE_DEFLATE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
def test_write_compression_lzma():
"""Test write LZMA compression."""
data = WRITE_DATA
with TempFileName('compression_lzma') as fname:
imwrite(fname, data, compression=LZMA, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == LZMA
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert page.rowsperstrip == 108
assert len(page.dataoffsets) == 9
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS or not imagecodecs.ZSTD, reason=REASON)
def test_write_compression_zstd():
"""Test write ZSTD compression."""
data = WRITE_DATA
with TempFileName('compression_zstd') as fname:
imwrite(fname, data, compression=ZSTD, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == ZSTD
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert page.rowsperstrip == 108
assert len(page.dataoffsets) == 9
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS or not imagecodecs.WEBP, reason=REASON)
def test_write_compression_webp():
"""Test write WEBP compression."""
data = WRITE_DATA.astype(numpy.uint8).reshape((219, 301, 3))
with TempFileName('compression_webp') as fname:
imwrite(fname, data, compression=(WEBP, -1), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == WEBP
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS or not imagecodecs.JPEGXL, reason=REASON)
def test_write_compression_jpegxl():
"""Test write JPEG XL compression."""
data = WRITE_DATA.astype(numpy.uint8).reshape((219, 301, 3))
with TempFileName('compression_jpegxl') as fname:
imwrite(fname, data, compression=(JPEGXL, -1), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == JPEGXL
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
def test_write_compression_lerc():
"""Test write LERC compression."""
if not hasattr(imagecodecs, 'LERC'):
pytest.skip('LERC codec missing')
data = WRITE_DATA.astype(numpy.uint16).reshape((219, 301, 3))
with TempFileName('compression_lerc') as fname:
imwrite(fname, data, compression=LERC, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == LERC
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
@pytest.mark.parametrize('dtype', [numpy.int8, numpy.uint8, numpy.bool8])
@pytest.mark.parametrize('tile', [None, (16, 16)])
def test_write_compression_packbits(dtype, tile):
"""Test write PackBits compression."""
dtype = numpy.dtype(dtype)
uncompressed = numpy.frombuffer(
b'\xaa\xaa\xaa\x80\x00\x2a\xaa\xaa\xaa\xaa\x80\x00'
b'\x2a\x22\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa',
dtype=dtype,
)
shape = 2, 7, uncompressed.size
data = numpy.empty(shape, dtype=dtype)
data[..., :] = uncompressed
with TempFileName(f'compression_packits_{dtype}') as fname:
imwrite(fname, data, compression=PACKBITS, tile=tile)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == PACKBITS
assert page.planarconfig == CONTIG
assert page.imagewidth == uncompressed.size
assert page.imagelength == 7
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_compression_rowsperstrip():
"""Test write rowsperstrip with compression."""
data = WRITE_DATA
with TempFileName('compression_rowsperstrip') as fname:
imwrite(
fname,
data,
compression=ADOBE_DEFLATE,
rowsperstrip=32,
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == ADOBE_DEFLATE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert page.rowsperstrip == 32
assert len(page.dataoffsets) == 21
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_compression_tiled():
"""Test write compressed tiles."""
data = WRITE_DATA
with TempFileName('compression_tiled') as fname:
imwrite(
fname,
data,
compression=ADOBE_DEFLATE,
tile=(32, 32),
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.is_tiled
assert page.compression == ADOBE_DEFLATE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == 210
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_compression_predictor():
"""Test write horizontal differencing."""
data = WRITE_DATA
with TempFileName('compression_predictor') as fname:
imwrite(
fname,
data,
compression=ADOBE_DEFLATE,
predictor=HORIZONTAL,
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.compression == ADOBE_DEFLATE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.predictor == HORIZONTAL
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
@pytest.mark.parametrize('dtype', [numpy.uint16, numpy.float32])
def test_write_compression_predictor_tiled(dtype):
"""Test write horizontal differencing with tiles."""
dtype = numpy.dtype(dtype)
data = WRITE_DATA.astype(dtype)
with TempFileName(f'compression_tiled_predictor_{dtype}') as fname:
imwrite(
fname,
data,
compression=ADOBE_DEFLATE,
predictor=True,
tile=(32, 32),
photometric=RGB,
)
if dtype.kind != 'f':
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.is_tiled
assert page.compression == ADOBE_DEFLATE
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert page.predictor == 3 if dtype.kind == 'f' else 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_rowsperstrip():
"""Test write rowsperstrip without compression."""
data = WRITE_DATA
with TempFileName('rowsperstrip') as fname:
imwrite(
fname,
data,
rowsperstrip=32,
contiguous=False,
photometric=RGB,
metadata=None,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
assert page.rowsperstrip == 32
assert len(page.dataoffsets) == 21
stripbytecounts = page.tags['StripByteCounts'].value
assert stripbytecounts[0] == 19264
assert stripbytecounts[6] == 16254
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_BE, reason=REASON)
def test_write_write_bigendian():
"""Test write big endian file."""
# also test memory mapping non-native byte order
data = random_data(numpy.float32, (2, 3, 219, 301)).newbyteorder()
data = numpy.nan_to_num(data, copy=False)
with TempFileName('write_bigendian') as fname:
imwrite(fname, data, planarconfig=SEPARATE, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert len(tif.series) == 1
assert tif.byteorder == '>'
# assert not tif.isnative
assert tif.series[0].offset is not None
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
# test reading data
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
image = page.asarray()
assert_array_equal(data[0], image)
# test direct memory mapping; returns big endian array
image = tif.asarray(out='memmap')
assert isinstance(image, numpy.core.memmap)
assert image.dtype == numpy.dtype('>f4')
assert_array_equal(data, image)
del image
image = page.asarray(out='memmap')
assert isinstance(image, numpy.core.memmap)
assert image.dtype == numpy.dtype('>f4')
assert_array_equal(data[0], image)
del image
# test indirect memory mapping; returns native endian array
image = tif.asarray(out='memmap:')
assert isinstance(image, numpy.core.memmap)
assert image.dtype == numpy.dtype('=f4')
assert_array_equal(data, image)
del image
image = page.asarray(out='memmap:')
assert isinstance(image, numpy.core.memmap)
assert image.dtype == numpy.dtype('=f4')
assert_array_equal(data[0], image)
del image
# test 2nd page
page = tif.pages[1]
image = page.asarray(out='memmap')
assert isinstance(image, numpy.core.memmap)
assert image.dtype == numpy.dtype('>f4')
assert_array_equal(data[1], image)
del image
image = page.asarray(out='memmap:')
assert isinstance(image, numpy.core.memmap)
assert image.dtype == numpy.dtype('=f4')
assert_array_equal(data[1], image)
del image
assert__str__(tif)
def test_write_zero_size():
"""Test write zero size array no longer fails."""
# with pytest.raises(ValueError):
with pytest.warns(UserWarning):
with TempFileName('empty') as fname:
imwrite(fname, numpy.empty(0))
def test_write_pixel():
"""Test write single pixel."""
data = numpy.zeros(1, dtype=numpy.uint8)
with TempFileName('pixel') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
assert tif.series[0].axes == 'Y'
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 1
assert page.imagelength == 1
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert_aszarr_method(tif, image, chunkmode='page')
assert__str__(tif)
def test_write_small():
"""Test write small image."""
data = random_data(numpy.uint8, (1, 1))
with TempFileName('small') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 1
assert page.imagelength == 1
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_2d_as_rgb():
"""Test write RGB color palette as RGB image."""
# image length should be 1
data = numpy.arange(3 * 256, dtype=numpy.uint16).reshape(256, 3) // 3
with TempFileName('2d_as_rgb_contig') as fname:
imwrite(fname, data, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
assert tif.series[0].axes == 'XS'
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 256
assert page.imagelength == 1
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert_aszarr_method(tif, image, chunkmode='page')
assert__str__(tif)
def test_write_invalid_contig_rgb():
"""Test write planar RGB with 2 samplesperpixel."""
data = random_data(numpy.uint8, (219, 301, 2))
with pytest.raises(ValueError):
with TempFileName('invalid_contig_rgb') as fname:
imwrite(fname, data, photometric=RGB)
# default to pages
with TempFileName('invalid_contig_rgb_pages') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 219
assert tif.series[0].axes == 'QYX'
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 2
assert page.imagelength == 301
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
# better save as contig samples
with TempFileName('invalid_contig_rgb_samples') as fname:
imwrite(fname, data, planarconfig=CONTIG)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
assert tif.series[0].axes == 'YXS'
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_invalid_planar_rgb():
"""Test write planar RGB with 2 samplesperpixel."""
data = random_data(numpy.uint8, (2, 219, 301))
with pytest.raises(ValueError):
with TempFileName('invalid_planar_rgb') as fname:
imwrite(fname, data, photometric=RGB, planarconfig=SEPARATE)
# default to pages
with TempFileName('invalid_planar_rgb_pages') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
assert tif.series[0].axes == 'QYX'
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
# or save as planar samples
with TempFileName('invalid_planar_rgb_samples') as fname:
imwrite(fname, data, planarconfig=SEPARATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
assert tif.series[0].axes == 'SYX'
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_gray():
"""Test write grayscale with extrasamples contig."""
data = random_data(numpy.uint8, (301, 219, 2))
with TempFileName('extrasamples_gray') as fname:
imwrite(fname, data, extrasamples=UNASSALPHA)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.photometric == MINISBLACK
assert page.planarconfig == CONTIG
assert page.imagewidth == 219
assert page.imagelength == 301
assert page.samplesperpixel == 2
assert page.extrasamples[0] == 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_gray_planar():
"""Test write planar grayscale with extrasamples."""
data = random_data(numpy.uint8, (2, 301, 219))
with TempFileName('extrasamples_gray_planar') as fname:
imwrite(fname, data, planarconfig=SEPARATE, extrasamples=UNASSALPHA)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.photometric == MINISBLACK
assert page.planarconfig == SEPARATE
assert page.imagewidth == 219
assert page.imagelength == 301
assert page.samplesperpixel == 2
assert page.extrasamples[0] == 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_gray_mix():
"""Test write grayscale with multiple extrasamples."""
data = random_data(numpy.uint8, (301, 219, 4))
with TempFileName('extrasamples_gray_mix') as fname:
imwrite(
fname,
data,
photometric=MINISBLACK,
extrasamples=[ASSOCALPHA, UNASSALPHA, UNSPECIFIED],
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.photometric == MINISBLACK
assert page.imagewidth == 219
assert page.imagelength == 301
assert page.samplesperpixel == 4
assert page.extrasamples == (1, 2, 0)
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_unspecified():
"""Test write RGB with unspecified extrasamples by default."""
data = random_data(numpy.uint8, (301, 219, 5))
with TempFileName('extrasamples_unspecified') as fname:
imwrite(fname, data, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.photometric == RGB
assert page.imagewidth == 219
assert page.imagelength == 301
assert page.samplesperpixel == 5
assert page.extrasamples == (0, 0)
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_assocalpha():
"""Test write RGB with assocalpha extrasample."""
data = random_data(numpy.uint8, (219, 301, 4))
with TempFileName('extrasamples_assocalpha') as fname:
imwrite(fname, data, photometric=RGB, extrasamples=ASSOCALPHA)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 4
assert page.extrasamples[0] == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_mix():
"""Test write RGB with mixture of extrasamples."""
data = random_data(numpy.uint8, (219, 301, 6))
with TempFileName('extrasamples_mix') as fname:
imwrite(
fname,
data,
photometric=RGB,
extrasamples=[ASSOCALPHA, UNASSALPHA, UNSPECIFIED],
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 6
assert page.extrasamples == (1, 2, 0)
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_contig():
"""Test write contig grayscale with large number of extrasamples."""
data = random_data(numpy.uint8, (3, 219, 301))
with TempFileName('extrasamples_contig') as fname:
imwrite(fname, data, planarconfig=CONTIG)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 219
assert page.imagelength == 3
assert page.samplesperpixel == 301
assert len(page.extrasamples) == 301 - 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
# better save as RGB planar
with TempFileName('extrasamples_contig_planar') as fname:
imwrite(fname, data, photometric=RGB, planarconfig=SEPARATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_contig_rgb2():
"""Test write contig RGB with large number of extrasamples."""
data = random_data(numpy.uint8, (3, 219, 301))
with TempFileName('extrasamples_contig_rgb2') as fname:
imwrite(fname, data, photometric=RGB, planarconfig=CONTIG)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 219
assert page.imagelength == 3
assert page.samplesperpixel == 301
assert len(page.extrasamples) == 301 - 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
# better save as planar
with TempFileName('extrasamples_contig_rgb2_planar') as fname:
imwrite(fname, data, photometric=RGB, planarconfig=SEPARATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_planar():
"""Test write planar large number of extrasamples."""
data = random_data(numpy.uint8, (219, 301, 3))
with TempFileName('extrasamples_planar') as fname:
imwrite(fname, data, planarconfig=SEPARATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric != RGB
assert page.imagewidth == 3
assert page.imagelength == 301
assert page.samplesperpixel == 219
assert len(page.extrasamples) == 219 - 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_planar_rgb2():
"""Test write planar RGB with large number of extrasamples."""
data = random_data(numpy.uint8, (219, 301, 3))
with TempFileName('extrasamples_planar_rgb2') as fname:
imwrite(fname, data, photometric=RGB, planarconfig=SEPARATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 3
assert page.imagelength == 301
assert page.samplesperpixel == 219
assert len(page.extrasamples) == 219 - 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_minisblack_planar():
"""Test write planar minisblack."""
data = random_data(numpy.uint8, (3, 219, 301))
with TempFileName('minisblack_planar') as fname:
imwrite(fname, data, photometric=MINISBLACK)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 3
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_minisblack_contig():
"""Test write contig minisblack."""
data = random_data(numpy.uint8, (219, 301, 3))
with TempFileName('minisblack_contig') as fname:
imwrite(fname, data, photometric=MINISBLACK)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 219
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 3
assert page.imagelength == 301
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_scalar():
"""Test write 2D grayscale."""
data = random_data(numpy.uint8, (219, 301))
with TempFileName('scalar') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_scalar_3d():
"""Test write 3D grayscale."""
data = random_data(numpy.uint8, (63, 219, 301))
with TempFileName('scalar_3d') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 63
page = tif.pages[62]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
image = tif.asarray()
assert isinstance(image, numpy.ndarray)
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_scalar_4d():
"""Test write 4D grayscale."""
data = random_data(numpy.uint8, (3, 2, 219, 301))
with TempFileName('scalar_4d') as fname:
imwrite(fname, data)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 6
page = tif.pages[5]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_contig_extrasample():
"""Test write grayscale with contig extrasamples."""
data = random_data(numpy.uint8, (219, 301, 2))
with TempFileName('contig_extrasample') as fname:
imwrite(fname, data, planarconfig=CONTIG)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_planar_extrasample():
"""Test write grayscale with planar extrasamples."""
data = random_data(numpy.uint8, (2, 219, 301))
with TempFileName('planar_extrasample') as fname:
imwrite(fname, data, planarconfig=SEPARATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 2
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_auto_rgb_contig():
"""Test write auto contig RGB."""
data = random_data(numpy.uint8, (219, 301, 3))
with TempFileName('auto_rgb_contig') as fname:
imwrite(fname, data) # photometric=RGB
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_auto_rgb_planar():
"""Test write auto planar RGB."""
data = random_data(numpy.uint8, (3, 219, 301))
with TempFileName('auto_rgb_planar') as fname:
with pytest.warns(DeprecationWarning):
imwrite(fname, data) # photometric=RGB, planarconfig=SEPARATE
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_auto_rgba_contig():
"""Test write auto contig RGBA."""
data = random_data(numpy.uint8, (219, 301, 4))
with TempFileName('auto_rgba_contig') as fname:
imwrite(fname, data) # photometric=RGB
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 4
assert page.extrasamples[0] == UNASSALPHA
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_auto_rgba_planar():
"""Test write auto planar RGBA."""
data = random_data(numpy.uint8, (4, 219, 301))
with TempFileName('auto_rgba_planar') as fname:
with pytest.warns(DeprecationWarning):
imwrite(fname, data) # photometric=RGB, planarconfig=SEPARATE
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 4
assert page.extrasamples[0] == UNASSALPHA
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_contig_rgb():
"""Test write contig RGB with extrasamples."""
data = random_data(numpy.uint8, (219, 301, 8))
with TempFileName('extrasamples_contig') as fname:
imwrite(fname, data, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 8
assert len(page.extrasamples) == 5
assert page.extrasamples[0] == UNSPECIFIED
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_extrasamples_planar_rgb():
"""Test write planar RGB with extrasamples."""
data = random_data(numpy.uint8, (8, 219, 301))
with TempFileName('extrasamples_planar') as fname:
imwrite(fname, data, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 8
assert len(page.extrasamples) == 5
assert page.extrasamples[0] == UNSPECIFIED
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_PRIVATE or SKIP_CODECS, reason=REASON)
def test_write_cfa():
"""Test write uncompressed CFA image."""
# TODO: write a valid TIFF/EP file
data = imread(
private_file('DNG/cinemadng/M14-1451_000085_cDNG_uncompressed.dng')
)
extratags = [
(271, 's', 4, 'Make', False),
(272, 's', 5, 'Model', False),
(33421, 'H', 2, (2, 2), False), # CFARepeatPatternDim
(33422, 'B', 4, b'\x00\x01\x01\x02', False), # CFAPattern
# (37398, 'B', 4, b'\x01\x00\x00\x00', False), # TIFF/EPStandardID
# (37399, 'H', 1, 0) # SensingMethod Undefined
# (50706, 'B', 4, b'\x01\x04\x00\x00', False), # DNGVersion
]
with TempFileName('write_cfa') as fname:
imwrite(
fname,
data,
photometric=CFA,
software='Tifffile',
datetime=True,
extratags=extratags,
)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.compression == 1
assert page.photometric == CFA
assert page.imagewidth == 960
assert page.imagelength == 540
assert page.bitspersample == 16
assert page.tags['CFARepeatPatternDim'].value == (2, 2)
assert page.tags['CFAPattern'].value == b'\x00\x01\x01\x02'
assert_array_equal(page.asarray(), data)
assert_aszarr_method(page, data)
def test_write_tiled_compressed():
"""Test write compressed tiles."""
data = random_data(numpy.uint8, (3, 219, 301))
with TempFileName('tiled_compressed') as fname:
imwrite(
fname,
data,
photometric=RGB,
planarconfig=SEPARATE,
compression=(ADOBE_DEFLATE, 5),
tile=(96, 64),
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_tiled
assert not page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.tilewidth == 64
assert page.tilelength == 96
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_tiled():
"""Test write tiled."""
data = random_data(numpy.uint16, (219, 301))
with TempFileName('tiled') as fname:
imwrite(fname, data, tile=(96, 64))
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_tiled
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.tilewidth == 64
assert page.tilelength == 96
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_tiled_planar():
"""Test write planar tiles."""
data = random_data(numpy.uint8, (4, 219, 301))
with TempFileName('tiled_planar') as fname:
imwrite(
fname, data, tile=(96, 64), photometric=RGB, planarconfig=SEPARATE
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_tiled
assert not page.is_contiguous
assert not page.is_volumetric
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.tilewidth == 64
assert page.tilelength == 96
assert page.samplesperpixel == 4
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_tiled_contig():
"""Test write contig tiles."""
data = random_data(numpy.uint8, (219, 301, 3))
with TempFileName('tiled_contig') as fname:
imwrite(fname, data, tile=(96, 64), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_tiled
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.tilewidth == 64
assert page.tilelength == 96
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_tiled_pages():
"""Test write multiple tiled pages."""
data = random_data(numpy.uint8, (5, 219, 301, 3))
with TempFileName('tiled_pages') as fname:
imwrite(fname, data, tile=(96, 64), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 5
page = tif.pages[0]
assert page.is_tiled
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert not page.is_volumetric
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.tilewidth == 64
assert page.tilelength == 96
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_tileiter():
"""Test write tiles from iterator."""
data = numpy.arange(3 * 4 * 16 * 16, dtype=numpy.uint16).reshape(
(3 * 4, 16, 16)
)
def tiles():
for i in range(data.shape[0]):
yield data[i]
with TempFileName('write_tileiter') as fname:
with pytest.raises(StopIteration):
# missing tiles
imwrite(
fname,
tiles(),
shape=(43, 81),
tile=(16, 16),
dtype=numpy.uint16,
)
with pytest.raises(TypeError):
# missing parameters
imwrite(fname, tiles())
with pytest.raises(TypeError):
# missing parameters
imwrite(fname, tiles(), shape=(43, 81))
with pytest.raises(ValueError):
# dtype mismatch
imwrite(
fname,
tiles(),
shape=(43, 61),
tile=(16, 16),
dtype=numpy.uint32,
)
with pytest.raises(ValueError):
# shape mismatch
imwrite(
fname, tiles(), shape=(43, 61), tile=(8, 8), dtype=numpy.uint16
)
imwrite(
fname, tiles(), shape=(43, 61), tile=(16, 16), dtype=numpy.uint16
)
with TiffFile(fname) as tif:
page = tif.pages[0]
assert page.shape == (43, 61)
assert page.tilelength == 16
assert page.tilewidth == 16
image = page.asarray()
assert_array_equal(image[:16, :16], data[0])
for i, segment in enumerate(page.segments()):
assert_array_equal(numpy.squeeze(segment[0]), data[i])
def test_write_tileiter_separate():
"""Test write separate tiles from iterator."""
data = numpy.arange(2 * 3 * 4 * 16 * 16, dtype=numpy.uint16)
data = data.reshape((2 * 3 * 4, 16, 16))
def tiles():
for i in range(data.shape[0]):
yield data[i]
with TempFileName('write_tile_iter_separate') as fname:
imwrite(
fname,
tiles(),
shape=(2, 43, 61),
tile=(16, 16),
dtype=numpy.uint16,
planarconfig=SEPARATE,
compression=ADOBE_DEFLATE,
)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.shape == (2, 43, 61)
assert page.tilelength == 16
assert page.tilewidth == 16
assert page.planarconfig == 2
image = page.asarray()
assert_array_equal(image[0, :16, :16], data[0])
for i, segment in enumerate(page.segments()):
assert_array_equal(numpy.squeeze(segment[0]), data[i])
def test_write_pyramids():
"""Test write two pyramids to shaped file."""
data = random_data(numpy.uint8, (31, 64, 96, 3))
with TempFileName('pyramids') as fname:
with TiffWriter(fname) as tif:
# use pages
tif.write(data, tile=(16, 16), photometric=RGB)
# interrupt pyramid, e.g. thumbnail
tif.write(data[0, :, :, 0])
# pyramid levels
tif.write(
data[:, ::2, ::2],
tile=(16, 16),
subfiletype=1,
photometric=RGB,
)
tif.write(
data[:, ::4, ::4],
tile=(16, 16),
subfiletype=1,
photometric=RGB,
)
# second pyramid using volumetric with downsampling factor 3
tif.write(data, tile=(16, 16, 16), photometric=RGB)
tif.write(
data[::3, ::3, ::3],
tile=(16, 16, 16),
subfiletype=1,
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 3 * 31 + 2 + 1
assert len(tif.series) == 3
series = tif.series[0]
assert series.is_pyramidal
assert len(series.levels) == 3
assert len(series.levels[0].pages) == 31
assert len(series.levels[1].pages) == 31
assert len(series.levels[2].pages) == 31
assert series.levels[0].shape == (31, 64, 96, 3)
assert series.levels[1].shape == (31, 32, 48, 3)
assert series.levels[2].shape == (31, 16, 24, 3)
series = tif.series[1]
assert not series.is_pyramidal
assert series.shape == (64, 96)
series = tif.series[2]
assert series.is_pyramidal
assert len(series.levels) == 2
assert len(series.levels[0].pages) == 1
assert len(series.levels[1].pages) == 1
assert series.levels[0].keyframe.is_volumetric
assert series.levels[1].keyframe.is_volumetric
assert series.levels[0].shape == (31, 64, 96, 3)
assert series.levels[1].shape == (11, 22, 32, 3)
assert_array_equal(tif.asarray(), data)
assert_array_equal(tif.asarray(series=0, level=0), data)
assert_aszarr_method(tif, data, series=0, level=0)
assert_array_equal(
data[:, ::2, ::2], tif.asarray(series=0, level=1)
)
assert_aszarr_method(tif, data[:, ::2, ::2], series=0, level=1)
assert_array_equal(
data[:, ::4, ::4], tif.asarray(series=0, level=2)
)
assert_aszarr_method(tif, data[:, ::4, ::4], series=0, level=2)
assert_array_equal(data[0, :, :, 0], tif.asarray(series=1))
assert_aszarr_method(tif, data[0, :, :, 0], series=1)
assert_array_equal(data, tif.asarray(series=2, level=0))
assert_aszarr_method(tif, data, series=2, level=0)
assert_array_equal(
data[::3, ::3, ::3], tif.asarray(series=2, level=1)
)
assert_aszarr_method(tif, data[::3, ::3, ::3], series=2, level=1)
assert__str__(tif)
def test_write_volumetric_tiled():
"""Test write tiled volume."""
data = random_data(numpy.uint8, (253, 64, 96))
with TempFileName('volumetric_tiled') as fname:
imwrite(fname, data, tile=(64, 64, 64))
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_volumetric
assert page.is_tiled
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 96
assert page.imagelength == 64
assert page.imagedepth == 253
assert page.tilewidth == 64
assert page.tilelength == 64
assert page.tiledepth == 64
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
def test_write_volumetric_tiled_png():
"""Test write tiled volume using an image compressor."""
data = random_data(numpy.uint8, (16, 64, 96, 3))
with TempFileName('volumetric_tiled_png') as fname:
imwrite(
fname, data, tile=(1, 64, 64), photometric=RGB, compression=PNG
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_volumetric
assert page.is_tiled
assert page.compression == PNG
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 96
assert page.imagelength == 64
assert page.imagedepth == 16
assert page.tilewidth == 64
assert page.tilelength == 64
assert page.tiledepth == 1
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_volumetric_tiled_planar_rgb():
"""Test write 5D array as grayscale volumes."""
shape = (2, 3, 256, 64, 96)
data = numpy.empty(shape, dtype=numpy.uint8)
data[:] = numpy.arange(256, dtype=numpy.uint8).reshape(1, 1, -1, 1, 1)
with TempFileName('volumetric_tiled_planar_rgb') as fname:
imwrite(
fname,
data,
tile=(256, 64, 96),
photometric=RGB,
planarconfig=SEPARATE,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
page = tif.pages[0]
assert page.is_volumetric
assert page.is_tiled
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 96
assert page.imagelength == 64
assert page.imagedepth == 256
assert page.tilewidth == 96
assert page.tilelength == 64
assert page.tiledepth == 256
assert page.samplesperpixel == 3
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 2
assert series.offset is not None
assert series.shape == shape
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_volumetric_tiled_contig_rgb():
"""Test write 6D array as contig RGB volumes."""
shape = (2, 3, 256, 64, 96, 3)
data = numpy.empty(shape, dtype=numpy.uint8)
data[:] = numpy.arange(256, dtype=numpy.uint8).reshape(1, 1, -1, 1, 1, 1)
with TempFileName('volumetric_tiled_contig_rgb') as fname:
imwrite(fname, data, tile=(256, 64, 96), photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 6
page = tif.pages[0]
assert page.is_volumetric
assert page.is_tiled
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 96
assert page.imagelength == 64
assert page.imagedepth == 256
assert page.tilewidth == 96
assert page.tilelength == 64
assert page.tiledepth == 256
assert page.samplesperpixel == 3
# self.assertEqual(page.tags['TileOffsets'].value, (352,))
assert page.tags['TileByteCounts'].value == (4718592,)
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 6
assert series.offset is not None
assert series.shape == shape
image = tif.asarray()
assert_array_equal(data, image)
# assert iterating over series.pages
data = data.reshape(6, 256, 64, 96, 3)
for i, page in enumerate(series.pages):
image = page.asarray()
assert_array_equal(data[i], image)
assert_aszarr_method(page, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_LARGE, reason=REASON)
def test_write_volumetric_tiled_contig_rgb_empty():
"""Test write empty 6D array as contig RGB volumes."""
shape = (2, 3, 256, 64, 96, 3)
with TempFileName('volumetric_tiled_contig_rgb_empty') as fname:
with TiffWriter(fname) as tif:
tif.write(
shape=shape,
dtype=numpy.uint8,
tile=(256, 64, 96),
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 6
page = tif.pages[0]
assert page.is_volumetric
assert page.is_tiled
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 96
assert page.imagelength == 64
assert page.imagedepth == 256
assert page.tilewidth == 96
assert page.tilelength == 64
assert page.tiledepth == 256
assert page.samplesperpixel == 3
# self.assertEqual(page.tags['TileOffsets'].value, (352,))
assert page.tags['TileByteCounts'].value == (4718592,)
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 6
assert series.offset is not None
assert series.shape == shape
image = tif.asarray()
assert_array_equal(image.shape, shape)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_volumetric_striped():
"""Test write striped volume."""
data = random_data(numpy.uint8, (15, 63, 95))
with TempFileName('volumetric_striped') as fname:
imwrite(fname, data, volumetric=True)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_volumetric
assert not page.is_tiled
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 95
assert page.imagelength == 63
assert page.imagedepth == 15
assert len(page.dataoffsets) == 15
assert len(page.databytecounts) == 15
assert page.samplesperpixel == 1
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_CODECS, reason=REASON)
def test_write_volumetric_striped_png():
"""Test write tiled volume using an image compressor."""
data = random_data(numpy.uint8, (15, 63, 95, 3))
with TempFileName('volumetric_striped_png') as fname:
imwrite(
fname,
data,
photometric=RGB,
volumetric=True,
rowsperstrip=32,
compression=PNG,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_volumetric
assert not page.is_tiled
assert page.compression == PNG
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 95
assert page.imagelength == 63
assert page.imagedepth == 15
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == 30
assert len(page.databytecounts) == 30
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert_aszarr_method(tif, image, chunkmode='page')
assert__str__(tif)
def test_write_volumetric_striped_planar_rgb():
"""Test write 5D array as grayscale volumes."""
shape = (2, 3, 15, 63, 96)
data = numpy.empty(shape, dtype=numpy.uint8)
data[:] = numpy.arange(15, dtype=numpy.uint8).reshape(1, 1, -1, 1, 1)
with TempFileName('volumetric_striped_planar_rgb') as fname:
imwrite(fname, data, volumetric=True, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 2
page = tif.pages[0]
assert page.is_volumetric
assert not page.is_tiled
assert page.is_contiguous
assert page.planarconfig == SEPARATE
assert page.photometric == RGB
assert page.imagewidth == 96
assert page.imagelength == 63
assert page.imagedepth == 15
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == 15 * 3
assert len(page.databytecounts) == 15 * 3
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 2
assert series.offset is not None
assert series.shape == shape
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_volumetric_striped_contig_rgb():
"""Test write 6D array as contig RGB volumes."""
shape = (2, 3, 15, 63, 95, 3)
data = numpy.empty(shape, dtype=numpy.uint8)
data[:] = numpy.arange(15, dtype=numpy.uint8).reshape(1, 1, -1, 1, 1, 1)
with TempFileName('volumetric_striped_contig_rgb') as fname:
imwrite(fname, data, volumetric=True, photometric=RGB)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 6
page = tif.pages[0]
assert page.is_volumetric
assert not page.is_tiled
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 95
assert page.imagelength == 63
assert page.imagedepth == 15
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == 15
assert len(page.databytecounts) == 15
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 6
assert series.offset is not None
assert series.shape == shape
image = tif.asarray()
assert_array_equal(data, image)
# assert iterating over series.pages
data = data.reshape(6, 15, 63, 95, 3)
for i, page in enumerate(series.pages):
image = page.asarray()
assert_array_equal(data[i], image)
assert_aszarr_method(page, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_LARGE, reason=REASON)
def test_write_volumetric_striped_contig_rgb_empty():
"""Test write empty 6D array as contig RGB volumes."""
shape = (2, 3, 15, 63, 95, 3)
with TempFileName('volumetric_striped_contig_rgb_empty') as fname:
with TiffWriter(fname) as tif:
tif.write(
shape=shape,
dtype=numpy.uint8,
volumetric=True,
photometric=RGB,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 6
page = tif.pages[0]
assert page.is_volumetric
assert not page.is_tiled
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 95
assert page.imagelength == 63
assert page.imagedepth == 15
assert page.samplesperpixel == 3
assert len(page.dataoffsets) == 15
assert len(page.databytecounts) == 15
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 6
assert series.offset is not None
assert series.shape == shape
image = tif.asarray()
assert_array_equal(image.shape, shape)
assert_aszarr_method(tif, image)
assert__str__(tif)
def test_write_contiguous():
"""Test contiguous mode."""
data = random_data(numpy.uint8, (5, 4, 219, 301, 3))
with TempFileName('write_contiguous') as fname:
with TiffWriter(fname, bigtiff=True) as tif:
for i in range(data.shape[0]):
tif.write(data[i], contiguous=True, photometric=RGB)
# assert_jhove(fname)
with TiffFile(fname) as tif:
assert tif.is_bigtiff
assert len(tif.pages) == 20
# check metadata is updated in-place
assert tif.pages[0].tags[270].valueoffset < tif.pages[1].offset
for page in tif.pages:
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 3
image = tif.asarray()
assert_array_equal(data, image)
assert_aszarr_method(tif, image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_LARGE, reason=REASON)
def test_write_3gb():
"""Test write 3 GB no-BigTiff file."""
# https://github.com/blink1073/tifffile/issues/47
data = numpy.empty((4096 - 32, 1024, 1024), dtype=numpy.uint8)
with TempFileName('3gb', remove=False) as fname:
imwrite(fname, data)
del data
assert_valid_tiff(fname)
# assert file
with TiffFile(fname) as tif:
assert not tif.is_bigtiff
@pytest.mark.skipif(SKIP_LARGE, reason=REASON)
def test_write_bigtiff():
"""Test write 5GB BigTiff file."""
data = numpy.empty((640, 1024, 1024), dtype=numpy.float64)
data[:] = numpy.arange(640, dtype=numpy.float64).reshape(-1, 1, 1)
with TempFileName('bigtiff') as fname:
# TiffWriter should fail without bigtiff parameter
with pytest.raises(ValueError):
with TiffWriter(fname) as tif:
tif.write(data)
# imwrite should use bigtiff for large data
imwrite(fname, data)
# assert_jhove(fname)
# assert file
with TiffFile(fname) as tif:
assert tif.is_bigtiff
assert len(tif.pages) == 640
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 1024
assert page.imagelength == 1024
assert page.samplesperpixel == 1
image = tif.asarray(out='memmap')
assert_array_equal(data, image)
del image
del data
assert__str__(tif)
@pytest.mark.parametrize('compression', [0, 6])
@pytest.mark.parametrize('dtype', [numpy.uint8, numpy.uint16])
def test_write_palette(dtype, compression):
"""Test write palette images."""
dtype = numpy.dtype(dtype)
data = random_data(dtype, (3, 219, 301))
cmap = random_data(numpy.uint16, (3, 2 ** (data.itemsize * 8)))
with TempFileName(f'palette_{compression}{dtype}') as fname:
imwrite(
fname,
data,
colormap=cmap,
compression=(ADOBE_DEFLATE, compression)
if compression
else compression,
)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 3
page = tif.pages[0]
assert page.is_contiguous != bool(compression)
assert page.planarconfig == CONTIG
assert page.photometric == PALETTE
assert page.imagewidth == 301
assert page.imagelength == 219
assert page.samplesperpixel == 1
for i, page in enumerate(tif.pages):
assert_array_equal(apply_colormap(data[i], cmap), page.asrgb())
assert__str__(tif)
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_write_palette_django():
"""Test write palette read from existing file."""
fname = private_file('django.tiff')
with TiffFile(fname) as tif:
page = tif.pages[0]
assert page.photometric == PALETTE
assert page.imagewidth == 320
assert page.imagelength == 480
data = page.asarray() # .squeeze() # UserWarning ...
cmap = page.colormap
assert__str__(tif)
with TempFileName('palette_django') as fname:
imwrite(fname, data, colormap=cmap, compression=ADOBE_DEFLATE)
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 1
page = tif.pages[0]
assert not page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == PALETTE
assert page.imagewidth == 320
assert page.imagelength == 480
assert page.samplesperpixel == 1
image = page.asrgb(uint8=False)
assert_array_equal(apply_colormap(data, cmap), image)
assert__str__(tif)
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_write_multiple_series():
"""Test write multiple data into one file using various options."""
data1 = imread(private_file('ome/multi-channel-4D-series.ome.tif'))
image1 = imread(private_file('django.tiff'))
image2 = imread(private_file('horse-16bit-col-littleendian.tif'))
with TempFileName('multiple_series') as fname:
with TiffWriter(fname, bigtiff=False) as tif:
# series 0
tif.write(
image1, compression=(ADOBE_DEFLATE, 5), description='Django'
)
# series 1
tif.write(image2, photometric=RGB)
# series 2
tif.write(data1[0], metadata=dict(axes='TCZYX'))
for i in range(1, data1.shape[0]):
tif.write(data1[i], contiguous=True)
# series 3
tif.write(data1[0], contiguous=False)
# series 4
tif.write(data1[0, 0, 0], tile=(64, 64))
# series 5
tif.write(image1, compression=ADOBE_DEFLATE, description='DEFLATE')
assert_valid_tiff(fname)
with TiffFile(fname) as tif:
assert len(tif.pages) == 124
assert len(tif.series) == 6
serie = tif.series[0]
assert not serie.offset
assert serie.axes == 'YX'
assert_array_equal(image1, serie.asarray())
assert_aszarr_method(serie, image1)
serie = tif.series[1]
assert serie.offset
assert serie.axes == 'YXS'
assert_array_equal(image2, serie.asarray())
assert_aszarr_method(serie, image2)
serie = tif.series[2]
assert serie.offset
assert serie.pages[0].is_contiguous
assert serie.axes == 'TCZYX'
result = serie.asarray(out='memmap')
assert_array_equal(data1, result)
assert_aszarr_method(serie, data1)
assert tif.filehandle.path == result.filename
del result
serie = tif.series[3]
assert serie.offset
assert serie.axes == 'QQYX'
assert_array_equal(data1[0], serie.asarray())
assert_aszarr_method(serie, data1[0])
serie = tif.series[4]
assert not serie.offset
assert serie.axes == 'YX'
assert_array_equal(data1[0, 0, 0], serie.asarray())
assert_aszarr_method(serie, data1[0, 0, 0])
serie = tif.series[5]
assert not serie.offset
assert serie.axes == 'YX'
assert_array_equal(image1, serie.asarray())
assert_aszarr_method(serie, image1)
assert__str__(tif)
# test TiffFile.asarray key and series parameters
assert_array_equal(image1, tif.asarray(key=0))
assert_array_equal(image1, tif.asarray(key=-1))
assert_array_equal(image2, tif.asarray(key=[1]))
assert_array_equal(image2, tif.asarray(key=0, series=1))
assert_array_equal(
image2, tif.asarray(key=0, series=tif.series[1])
)
assert_array_equal(
data1, tif.asarray(key=range(2, 107)).reshape(data1.shape)
)
assert_array_equal(
data1,
tif.asarray(key=range(105), series=2).reshape(data1.shape),
)
assert_array_equal(
data1,
tif.asarray(key=slice(None), series=2).reshape(data1.shape),
)
assert_array_equal(
data1[0],
tif.asarray(key=slice(107, 122)).reshape(data1[0].shape),
)
assert_array_equal(
data1[0].reshape(-1, 167, 439)[::2],
tif.asarray(key=slice(107, 122, 2)).reshape((-1, 167, 439)),
)
with pytest.raises(RuntimeError):
tif.asarray(key=[0, 1])
with pytest.raises(RuntimeError):
tif.asarray(key=[-3, -2])
assert_array_equal(image1, imread(fname, key=0))
assert_array_equal(image1, imread(fname, key=-1))
assert_array_equal(image2, imread(fname, key=[1]))
assert_array_equal(
data1, imread(fname, key=range(2, 107)).reshape(data1.shape)
)
assert_array_equal(
data1, imread(fname, key=range(105), series=2).reshape(data1.shape)
)
assert_array_equal(
data1[0],
imread(fname, key=slice(107, 122)).reshape(data1[0].shape),
)
def assert_fsspec(url, data, target_protocol='http'):
"""Assert fsspec ReferenceFileSystem from local http server."""
mapper = fsspec.get_mapper(
'reference://', fo=url, target_protocol=target_protocol
)
zobj = zarr.open(mapper, mode='r')
if isinstance(zobj, zarr.Group):
assert_array_equal(zobj[0][:], data)
assert_array_equal(zobj[1][:], data[:, ::2, ::2])
assert_array_equal(zobj[2][:], data[:, ::4, ::4])
else:
assert_array_equal(zobj[:], data)
@pytest.mark.skipif(
SKIP_HTTP or SKIP_ZARR or SKIP_CODECS or not imagecodecs.JPEG,
reason=REASON,
)
@pytest.mark.parametrize('version', [0, 1])
def test_write_fsspec(version):
"""Test write fsspec for multi-series OME-TIFF."""
try:
from imagecodecs.numcodecs import register_codecs
except ImportError:
register_codecs = None
else:
register_codecs('imagecodecs_delta', verbose=False)
data0 = random_data(numpy.uint8, (3, 252, 244))
data1 = random_data(numpy.uint8, (219, 301, 3))
data2 = random_data(numpy.uint16, (3, 219, 301))
with TempFileName('write_fsspec', ext='.ome.tif') as fname:
filename = os.path.split(fname)[-1]
with TiffWriter(fname, ome=True, byteorder='>') as tif:
# series 0
options = dict(
tile=(64, 64),
photometric=MINISBLACK,
compression=DEFLATE,
predictor=HORIZONTAL,
)
tif.write(data0, subifds=2, **options)
tif.write(data0[:, ::2, ::2], subfiletype=1, **options)
tif.write(data0[:, ::4, ::4], subfiletype=1, **options)
# series 1
tif.write(data1, photometric=RGB, rowsperstrip=data1.shape[0])
# series 2
tif.write(
data2,
rowsperstrip=data1.shape[1],
photometric=RGB,
planarconfig=SEPARATE,
)
# series 3
tif.write(data1, photometric=RGB, rowsperstrip=5)
# series 4
tif.write(data1, photometric=RGB, tile=(32, 32), compression=JPEG)
with TiffFile(fname) as tif:
assert tif.is_ome
assert len(tif.series) == 5
# TODO: clean up temp JSON files
with tif.series[0].aszarr() as store:
assert store.is_multiscales
store.write_fsspec(
fname + f'.v{version}.s0.json', URL, version=version
)
assert_fsspec(URL + filename + f'.v{version}.s0.json', data0)
with tif.series[1].aszarr() as store:
assert not store.is_multiscales
store.write_fsspec(
fname + f'.v{version}.s1.json', URL, version=version
)
assert_fsspec(URL + filename + f'.v{version}.s1.json', data1)
with tif.series[2].aszarr() as store:
store.write_fsspec(
fname + f'.v{version}.s2.json', URL, version=version
)
assert_fsspec(URL + filename + f'.v{version}.s2.json', data2)
with tif.series[3].aszarr(chunkmode=2) as store:
store.write_fsspec(
fname + f'.v{version}.s3.json', URL, version=version
)
assert_fsspec(URL + filename + f'.v{version}.s3.json', data1)
with tif.series[3].aszarr() as store:
with pytest.raises(ValueError):
# imagelength % rowsperstrip != 0
store.write_fsspec(
fname + f'.v{version}.s3fail.json',
URL,
version=version,
)
with tif.series[4].aszarr() as store:
store.write_fsspec(
fname + f'.v{version}.s4.json', URL, version=version
)
if version == 0:
with pytest.raises(ValueError):
# codec not available: 'imagecodecs_jpeg'
assert_fsspec(
URL + filename + f'.v{version}.s4.json', data1
)
if register_codecs is not None:
register_codecs('imagecodecs_jpeg', verbose=False)
assert_fsspec(
URL + filename + f'.v{version}.s4.json',
tif.series[4].asarray(),
)
@pytest.mark.skipif(
SKIP_PRIVATE or SKIP_LARGE or SKIP_CODECS or SKIP_ZARR, reason=REASON
)
@pytest.mark.parametrize('version', [1]) # 0,
def test_write_fsspec_sequence(version):
"""Test write fsspec for multi-file sequence."""
# https://bbbc.broadinstitute.org/BBBC006
categories = {'p': {chr(i + 97): i for i in range(25)}}
ptrn = r'(?:_(z)_(\d+)).*_(?P[a-z])(?P\d+)(?:_(s)(\d))(?:_(w)(\d))'
fnames = private_file('BBBC/BBBC006_v1_images_z_00/*.tif')
fnames += private_file('BBBC/BBBC006_v1_images_z_01/*.tif')
tifs = TiffSequence(
fnames,
imread=imagecodecs.imread,
pattern=ptrn,
axesorder=(1, 2, 0, 3, 4),
categories=categories,
)
assert len(tifs) == 3072
assert tifs.shape == (16, 24, 2, 2, 2)
assert tifs.axes == 'PAZSW'
data = tifs.asarray()
with TempFileName(
'write_fsspec_sequence', ext=f'.v{version}.json'
) as fname:
with tifs.aszarr(codec=imagecodecs.tiff_decode) as store:
store.write_fsspec(
fname,
'file:///' + store._commonpath.replace('\\', '/'),
version=version,
)
mapper = fsspec.get_mapper(
'reference://', fo=fname, target_protocol='file'
)
from imagecodecs.numcodecs import register_codecs
register_codecs()
za = zarr.open(mapper, mode='r')
assert_array_equal(za[:], data)
@pytest.mark.skipif(SKIP_ZARR, reason=REASON)
def test_write_numcodecs():
"""Test write zarr with numcodecs.Tiff."""
from tifffile import numcodecs
data = numpy.arange(256 * 256 * 3, dtype=numpy.uint16).reshape(256, 256, 3)
numcodecs.register_codec()
compressor = numcodecs.Tiff(
bigtiff=True,
photometric=MINISBLACK,
planarconfig=CONTIG,
compression=(ADOBE_DEFLATE, 5),
key=0,
)
with TempFileName('write_numcodecs', ext='.zarr') as fname:
z = zarr.open(
fname,
mode='w',
shape=(256, 256, 3),
chunks=(100, 100, 3),
dtype=numpy.uint16,
compressor=compressor,
)
z[:] = data
assert_array_equal(z[:], data)
###############################################################################
# Test ImageJ writing
@pytest.mark.skipif(SKIP_EXTENDED, reason=REASON)
@pytest.mark.parametrize(
'shape',
[
(219, 301, 1),
(219, 301, 2),
(219, 301, 3),
(219, 301, 4),
(219, 301, 5),
(1, 219, 301),
(2, 219, 301),
(3, 219, 301),
(4, 219, 301),
(5, 219, 301),
(4, 3, 219, 301),
(4, 219, 301, 3),
(3, 4, 219, 301),
(1, 3, 1, 219, 301),
(3, 1, 1, 219, 301),
(1, 3, 4, 219, 301),
(3, 1, 4, 219, 301),
(3, 4, 1, 219, 301),
(3, 4, 1, 219, 301, 3),
(2, 3, 4, 219, 301),
(4, 3, 2, 219, 301, 3),
],
)
@pytest.mark.parametrize(
'dtype', [numpy.uint8, numpy.uint16, numpy.int16, numpy.float32]
)
@pytest.mark.parametrize('byteorder', ['>', '<'])
def test_write_imagej(byteorder, dtype, shape):
"""Test write ImageJ format."""
# TODO: test compression and bigtiff ?
dtype = numpy.dtype(dtype)
if dtype != numpy.uint8 and shape[-1] in (3, 4):
pytest.xfail('ImageJ only supports uint8 RGB')
data = random_data(dtype, shape)
fname = 'imagej_{}_{}_{}'.format(
{'<': 'le', '>': 'be'}[byteorder], dtype, str(shape).replace(' ', '')
)
with TempFileName(fname) as fname:
imwrite(fname, data, byteorder=byteorder, imagej=True)
image = imread(fname)
assert_array_equal(data.squeeze(), image.squeeze())
# TODO: assert_aszarr_method
assert_valid_tiff(fname)
def test_write_imagej_voxel_size():
"""Test write ImageJ with xyz voxel size 2.6755x2.6755x3.9474 µm^3."""
data = numpy.zeros((4, 256, 256), dtype=numpy.float32)
data.shape = 4, 1, 256, 256
with TempFileName('imagej_voxel_size') as fname:
imwrite(
fname,
data,
imagej=True,
resolution=(0.373759, 0.373759),
metadata={'spacing': 3.947368, 'unit': 'um'},
)
with TiffFile(fname) as tif:
assert tif.is_imagej
assert 'unit' in tif.imagej_metadata
assert tif.imagej_metadata['unit'] == 'um'
series = tif.series[0]
assert series.axes == 'ZYX'
assert series.shape == (4, 256, 256)
assert series.get_axes(False) == 'TZCYXS'
assert series.get_shape(False) == (1, 4, 1, 256, 256, 1)
assert__str__(tif)
assert_valid_tiff(fname)
def test_write_imagej_metadata():
"""Test write additional ImageJ metadata."""
data = numpy.empty((4, 256, 256), dtype=numpy.uint16)
data[:] = numpy.arange(256 * 256, dtype=numpy.uint16).reshape(1, 256, 256)
with TempFileName('imagej_metadata') as fname:
imwrite(fname, data, imagej=True, metadata={'unit': 'um'})
with TiffFile(fname) as tif:
assert tif.is_imagej
assert 'unit' in tif.imagej_metadata
assert tif.imagej_metadata['unit'] == 'um'
assert__str__(tif)
assert_valid_tiff(fname)
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_write_imagej_ijmetadata_tag():
"""Test write and read IJMetadata tag."""
fname = private_file('imagej/IJMetadata.tif')
with TiffFile(fname) as tif:
assert tif.is_imagej
assert tif.byteorder == '>'
assert len(tif.pages) == 3
assert len(tif.series) == 1
data = tif.asarray()
ijmetadata = tif.pages[0].tags['IJMetadata'].value
assert ijmetadata['Info'][:21] == 'FluorescentCells.tif\n'
assert ijmetadata['ROI'][:5] == b'Iout\x00'
assert ijmetadata['Overlays'][1][:5] == b'Iout\x00'
assert ijmetadata['Ranges'] == (0.0, 255.0, 0.0, 255.0, 0.0, 255.0)
assert ijmetadata['Labels'] == ['Red', 'Green', 'Blue']
assert ijmetadata['LUTs'][2][2, 255] == 255
assert_valid_tiff(fname)
with TempFileName('imagej_ijmetadata') as fname:
with pytest.warns(DeprecationWarning):
imwrite(
fname,
data,
byteorder='>',
imagej=True,
metadata={'mode': 'composite'},
ijmetadata=ijmetadata,
)
imwrite(
fname,
data,
byteorder='>',
imagej=True,
metadata={**ijmetadata, 'mode': 'composite'},
)
with TiffFile(fname) as tif:
assert tif.is_imagej
assert tif.byteorder == '>'
assert len(tif.pages) == 3
assert len(tif.series) == 1
imagej_metadata = tif.imagej_metadata
data2 = tif.asarray()
ijmetadata2 = tif.pages[0].tags['IJMetadata'].value
assert__str__(tif)
assert_array_equal(data, data2)
assert imagej_metadata['mode'] == 'composite'
assert imagej_metadata['Info'] == ijmetadata['Info']
assert ijmetadata2['Info'] == ijmetadata['Info']
assert ijmetadata2['ROI'] == ijmetadata['ROI']
assert ijmetadata2['Overlays'] == ijmetadata['Overlays']
assert ijmetadata2['Ranges'] == ijmetadata['Ranges']
assert ijmetadata2['Labels'] == ijmetadata['Labels']
assert_array_equal(ijmetadata2['LUTs'][2], ijmetadata['LUTs'][2])
assert_valid_tiff(fname)
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_write_imagej_roundtrip():
"""Test ImageJ metadata survive read/write roundtrip."""
fname = private_file('imagej/IJMetadata.tif')
with TiffFile(fname) as tif:
assert tif.is_imagej
assert tif.byteorder == '>'
assert len(tif.pages) == 3
assert len(tif.series) == 1
data = tif.asarray()
ijmetadata = tif.imagej_metadata
assert ijmetadata['Info'][:21] == 'FluorescentCells.tif\n'
assert ijmetadata['ROI'][:5] == b'Iout\x00'
assert ijmetadata['Overlays'][1][:5] == b'Iout\x00'
assert ijmetadata['Ranges'] == (0.0, 255.0, 0.0, 255.0, 0.0, 255.0)
assert ijmetadata['Labels'] == ['Red', 'Green', 'Blue']
assert ijmetadata['LUTs'][2][2, 255] == 255
assert ijmetadata['mode'] == 'composite'
assert not ijmetadata['loop']
assert ijmetadata['ImageJ'] == '1.52b'
assert_valid_tiff(fname)
with TempFileName('imagej_ijmetadata_roundtrip') as fname:
imwrite(fname, data, byteorder='>', imagej=True, metadata=ijmetadata)
with TiffFile(fname) as tif:
assert tif.is_imagej
assert tif.byteorder == '>'
assert len(tif.pages) == 3
assert len(tif.series) == 1
ijmetadata2 = tif.imagej_metadata
data2 = tif.asarray()
assert__str__(tif)
assert_array_equal(data, data2)
assert ijmetadata2['ImageJ'] == ijmetadata['ImageJ']
assert ijmetadata2['mode'] == ijmetadata['mode']
assert ijmetadata2['Info'] == ijmetadata['Info']
assert ijmetadata2['ROI'] == ijmetadata['ROI']
assert ijmetadata2['Overlays'] == ijmetadata['Overlays']
assert ijmetadata2['Ranges'] == ijmetadata['Ranges']
assert ijmetadata2['Labels'] == ijmetadata['Labels']
assert_array_equal(ijmetadata2['LUTs'][2], ijmetadata['LUTs'][2])
assert_valid_tiff(fname)
@pytest.mark.parametrize('mmap', [False, True])
@pytest.mark.parametrize('truncate', [False, True])
def test_write_imagej_hyperstack(truncate, mmap):
"""Test write ImageJ hyperstack."""
shape = (5, 6, 7, 49, 61, 3)
data = numpy.empty(shape, dtype=numpy.uint8)
data[:] = numpy.arange(210, dtype=numpy.uint8).reshape(5, 6, 7, 1, 1, 1)
_truncate = ['', '_trunc'][truncate]
_memmap = ['', '_memmap'][mmap]
with TempFileName(f'imagej_hyperstack{_truncate}{_memmap}') as fname:
if mmap:
image = memmap(
fname,
shape=data.shape,
dtype=data.dtype,
imagej=True,
truncate=truncate,
)
image[:] = data
del image
else:
imwrite(fname, data, truncate=truncate, imagej=True)
# assert file
with TiffFile(fname) as tif:
assert not tif.is_bigtiff
assert not tif.is_shaped
assert len(tif.pages) == 1 if truncate else 210
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric == RGB
assert page.imagewidth == 61
assert page.imagelength == 49
assert page.samplesperpixel == 3
# assert series properties
series = tif.series[0]
assert series.shape == shape
assert len(series._pages) == 1
assert len(series.pages) == 1 if truncate else 210
assert series.dtype == numpy.uint8
assert series.axes == 'TZCYXS'
assert series.get_axes(False) == 'TZCYXS'
assert series.get_shape(False) == shape
# assert data
image = tif.asarray(out='memmap')
assert_array_equal(data.squeeze(), image.squeeze())
del image
# assert iterating over series.pages
data = data.reshape(210, 49, 61, 3)
for i, page in enumerate(series.pages):
image = page.asarray()
assert_array_equal(data[i], image)
del image
assert__str__(tif)
assert_valid_tiff(fname)
def test_write_imagej_append():
"""Test write ImageJ file consecutively."""
data = numpy.empty((256, 1, 256, 256), dtype=numpy.uint8)
data[:] = numpy.arange(256, dtype=numpy.uint8).reshape(-1, 1, 1, 1)
with TempFileName('imagej_append') as fname:
with TiffWriter(fname, imagej=True) as tif:
for image in data:
tif.write(image, contiguous=True)
assert_valid_tiff(fname)
# assert file
with TiffFile(fname) as tif:
assert not tif.is_bigtiff
assert not tif.is_shaped
assert len(tif.pages) == 256
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 256
assert page.imagelength == 256
assert page.samplesperpixel == 1
# assert series properties
series = tif.series[0]
assert series.shape == (256, 256, 256)
assert series.dtype == numpy.uint8
assert series.axes == 'ZYX'
assert series.get_axes(False) == 'TZCYXS'
assert series.get_shape(False) == (1, 256, 1, 256, 256, 1)
# assert data
image = tif.asarray(out='memmap')
assert_array_equal(data.squeeze(), image)
del image
assert__str__(tif)
@pytest.mark.skipif(SKIP_LARGE, reason=REASON)
def test_write_imagej_raw():
"""Test write ImageJ 5 GB raw file."""
data = numpy.empty((1280, 1, 1024, 1024), dtype=numpy.float32)
data[:] = numpy.arange(1280, dtype=numpy.float32).reshape(-1, 1, 1, 1)
with TempFileName('imagej_big') as fname:
with pytest.warns(UserWarning):
# UserWarning: truncating ImageJ file
imwrite(fname, data, imagej=True)
assert_valid_tiff(fname)
# assert file
with TiffFile(fname) as tif:
assert not tif.is_bigtiff
assert not tif.is_shaped
assert len(tif.pages) == 1
page = tif.pages[0]
assert page.is_contiguous
assert page.planarconfig == CONTIG
assert page.photometric != RGB
assert page.imagewidth == 1024
assert page.imagelength == 1024
assert page.samplesperpixel == 1
# assert series properties
series = tif.series[0]
assert len(series._pages) == 1
assert len(series.pages) == 1
assert series.shape == (1280, 1024, 1024)
assert series.dtype == numpy.float32
assert series.axes == 'ZYX'
assert series.get_axes(False) == 'TZCYXS'
assert series.get_shape(False) == (1, 1280, 1, 1024, 1024, 1)
# assert data
image = tif.asarray(out='memmap')
assert_array_equal(data.squeeze(), image.squeeze())
del image
assert__str__(tif)
@pytest.mark.skipif(SKIP_EXTENDED, reason=REASON)
@pytest.mark.parametrize(
'shape, axes',
[
((219, 301, 1), None),
((219, 301, 2), None),
((219, 301, 3), None),
((219, 301, 4), None),
((219, 301, 5), None),
((1, 219, 301), None),
((2, 219, 301), None),
((3, 219, 301), None),
((4, 219, 301), None),
((5, 219, 301), None),
((4, 3, 219, 301), None),
((4, 219, 301, 3), None),
((3, 4, 219, 301), None),
((1, 3, 1, 219, 301), None),
((3, 1, 1, 219, 301), None),
((1, 3, 4, 219, 301), None),
((3, 1, 4, 219, 301), None),
((3, 4, 1, 219, 301), None),
((3, 4, 1, 219, 301, 3), None),
((2, 3, 4, 219, 301), None),
((4, 3, 2, 219, 301, 3), None),
((5, 1, 32, 32), 'CSYX'),
((5, 1, 32, 32), 'ZCYX'),
((2, 3, 4, 219, 301, 3), 'TCZYXS'),
((10, 5, 200, 200), 'EPYX'),
((2, 3, 4, 5, 6, 7, 32, 32, 3), 'TQCPZRYXS'),
],
)
def test_write_ome(shape, axes):
"""Test write OME-TIFF format."""
photometric = None
planarconfig = None
if shape[-1] in (3, 4):
photometric = RGB
planarconfig = CONTIG
elif shape[-3] in (3, 4):
photometric = RGB
planarconfig = SEPARATE
metadata = {'axes': axes} if axes is not None else {}
data = random_data(numpy.uint8, shape)
fname = 'write_ome_{}.ome'.format(str(shape).replace(' ', ''))
with TempFileName(fname) as fname:
imwrite(
fname,
data,
metadata=metadata,
photometric=photometric,
planarconfig=planarconfig,
)
with TiffFile(fname) as tif:
assert tif.is_ome
assert not tif.is_shaped
image = tif.asarray()
omexml = tif.ome_metadata
if axes:
assert tif.series[0].axes == squeeze_axes(shape, axes)[-1]
assert_array_equal(data.squeeze(), image.squeeze())
assert_aszarr_method(tif, image)
assert_valid_omexml(omexml)
assert_valid_tiff(fname)
def test_write_ome_enable():
"""Test OME-TIFF enabling."""
data = numpy.zeros((32, 32), dtype=numpy.uint8)
with TempFileName('write_ome_enable.ome') as fname:
imwrite(fname, data)
with TiffFile(fname) as tif:
assert tif.is_ome
imwrite(fname, data, description='not OME')
with TiffFile(fname) as tif:
assert not tif.is_ome
with pytest.warns(UserWarning):
imwrite(fname, data, description='not OME', ome=True)
with TiffFile(fname) as tif:
assert tif.is_ome
imwrite(fname, data, imagej=True)
with TiffFile(fname) as tif:
assert not tif.is_ome
assert tif.is_imagej
imwrite(fname, data, imagej=True, ome=True)
with TiffFile(fname) as tif:
assert tif.is_ome
assert not tif.is_imagej
with TempFileName('write_ome_auto.tif') as fname:
imwrite(fname, data)
with TiffFile(fname) as tif:
assert not tif.is_ome
imwrite(fname, data, ome=True)
with TiffFile(fname) as tif:
assert tif.is_ome
@pytest.mark.skipif(SKIP_PUBLIC, reason=REASON)
@pytest.mark.parametrize(
'method', ['manual', 'copy', 'iter', 'compression', 'xml']
)
def test_write_ome_methods(method):
"""Test re-write OME-TIFF."""
# 4D (7 time points, 5 focal planes)
fname = public_file('OME/bioformats-artificial/4D-series.ome.tiff')
with TiffFile(fname) as tif:
series = tif.series[0]
data = series.asarray()
dtype = data.dtype
shape = data.shape
axes = series.axes
omexml = tif.ome_metadata
def pages():
for image in data.reshape(-1, *data.shape[-2:]):
yield image
with TempFileName(f'write_ome_{method}.ome') as fname:
if method == 'xml':
# use original XML metadata
metadata = xml2dict(omexml)
metadata['axes'] = axes
imwrite(
fname,
data,
byteorder='>',
photometric=MINISBLACK,
metadata=metadata,
)
elif method == 'manual':
# manually write omexml to first page and data to individual pages
# process OME-XML
omexml = omexml.replace(
'4D-series.ome.tiff', os.path.split(fname)[-1]
)
# omexml = omexml.replace('BigEndian="true"', 'BigEndian="false"')
data = data.newbyteorder('>')
# save image planes in the order referenced in the OME-XML
# make sure storage options (compression, byteorder, photometric)
# match OME-XML
# write OME-XML to first page only
with TiffWriter(fname, byteorder='>') as tif:
for i, image in enumerate(pages()):
description = omexml if i == 0 else None
tif.write(
image,
description=description,
photometric=MINISBLACK,
metadata=None,
contiguous=False,
)
elif method == 'iter':
# use iterator over individual pages
imwrite(
fname,
pages(),
shape=shape,
dtype=dtype,
byteorder='>',
photometric=MINISBLACK,
metadata={'axes': axes},
)
elif method == 'compression':
# use iterator with compression
imwrite(
fname,
pages(),
shape=shape,
dtype=dtype,
compression=ADOBE_DEFLATE,
byteorder='>',
photometric=MINISBLACK,
metadata={'axes': axes},
)
elif method == 'copy':
# use one numpy array
imwrite(
fname,
data,
byteorder='>',
photometric=MINISBLACK,
metadata={'axes': axes},
)
with TiffFile(fname) as tif:
assert tif.is_ome
assert tif.byteorder == '>'
assert len(tif.pages) == 35
assert len(tif.series) == 1
# assert page properties
page = tif.pages[0]
if method != 'compression':
assert page.is_contiguous
assert page.compression == NONE
assert page.imagewidth == 439
assert page.imagelength == 167
assert page.bitspersample == 8
assert page.samplesperpixel == 1
# assert series properties
series = tif.series[0]
assert series.shape == (7, 5, 167, 439)
assert series.dtype == numpy.int8
assert series.axes == 'TZYX'
# assert data
assert_array_equal(data, tif.asarray())
assert_valid_omexml(tif.ome_metadata)
assert__str__(tif)
assert_valid_tiff(fname)
@pytest.mark.parametrize('contiguous', [True, False])
def test_write_ome_manual(contiguous):
"""Test writing OME-TIFF manually."""
data = numpy.random.randint(0, 255, (19, 31, 21), numpy.uint8)
with TempFileName(f'write_ome__manual{int(contiguous)}.ome') as fname:
with TiffWriter(fname) as tif:
# sucessively write image data to TIFF pages
# disable tifffile from writing any metadata
# add empty ImageDescription tag to first page
for i, frame in enumerate(data):
tif.write(
frame,
contiguous=contiguous,
metadata=None,
description=None if i else b'',
)
# update ImageDescription tag with custom OME-XML
xml = OmeXml()
xml.addimage(
numpy.uint8, (16, 31, 21), (16, 1, 1, 31, 21, 1), axes='ZYX'
)
xml.addimage(
numpy.uint8, (3, 31, 21), (3, 1, 1, 31, 21, 1), axes='CYX'
)
tif.overwrite_description(xml.tostring())
with TiffFile(fname) as tif:
assert tif.is_ome
assert len(tif.pages) == 19
assert len(tif.series) == 2
# assert series properties
series = tif.series[0]
assert series.axes == 'ZYX'
assert bool(series.offset) == contiguous
assert_array_equal(data[:16], series.asarray())
series = tif.series[1]
assert series.axes == 'CYX'
assert bool(series.offset) == contiguous
assert_array_equal(data[16:], series.asarray())
#
assert_valid_omexml(tif.ome_metadata)
assert__str__(tif)
assert_valid_tiff(fname)
@pytest.mark.skipif(
SKIP_PRIVATE or SKIP_CODECS or not imagecodecs.JPEG or SKIP_LARGE,
reason=REASON,
)
def test_write_ome_copy():
"""Test write pyramidal OME-TIFF by copying compressed tiles from SVS."""
def tiles(page):
# return iterator over compressed tiles in page
assert page.is_tiled
fh = page.parent.filehandle
for offset, bytecount in zip(page.dataoffsets, page.databytecounts):
fh.seek(offset)
yield fh.read(bytecount)
with TiffFile(private_file('AperioSVS/CMU-1.svs')) as svs:
assert svs.is_svs
levels = svs.series[0].levels
with TempFileName('_write_ome_copy', ext='.ome.tif') as fname:
with TiffWriter(fname, ome=True, bigtiff=True) as tif:
level = levels[0]
assert len(level.pages) == 1
page = level.pages[0]
if page.compression == 7:
# override default that RGB will be compressed as YCBCR
compressionargs = {'outcolorspace': page.photometric}
else:
compressionargs = {}
extratags = (
# copy some extra tags
page.tags.get('ImageDepth')._astuple(),
page.tags.get('InterColorProfile')._astuple(),
)
tif.write(
tiles(page),
shape=page.shape,
dtype=page.dtype,
tile=(page.tilelength, page.tilewidth),
photometric=page.photometric,
planarconfig=page.planarconfig,
compression=(page.compression, None, compressionargs),
jpegtables=page.jpegtables,
subsampling=page.subsampling,
subifds=len(levels) - 1,
extratags=extratags,
)
for level in levels[1:]:
assert len(level.pages) == 1
page = level.pages[0]
if page.compression == 7:
compressionargs = {'outcolorspace': page.photometric}
else:
compressionargs = {}
tif.write(
tiles(page),
shape=page.shape,
dtype=page.dtype,
tile=(page.tilelength, page.tilewidth),
photometric=page.photometric,
planarconfig=page.planarconfig,
compression=(page.compression, None, compressionargs),
jpegtables=page.jpegtables,
subsampling=page.subsampling,
subfiletype=1,
)
with TiffFile(fname) as tif:
assert tif.is_ome
assert len(tif.pages) == 1
assert len(tif.pages[0].pages) == 2
assert 'InterColorProfile' in tif.pages[0].tags
assert tif.pages[0].tags['ImageDepth'].value == 1
levels_ = tif.series[0].levels
assert len(levels_) == len(levels)
for level, level_ in zip(levels[1:], levels_[1:]):
assert level.shape == level_.shape
assert level.dtype == level_.dtype
assert_array_equal(level.asarray(), level_.asarray())
@pytest.mark.skipif(
SKIP_PRIVATE or SKIP_CODECS or not imagecodecs.JPEG, reason=REASON
)
@pytest.mark.xfail # TODO: should pass once strip generators are supported
def test_write_geotiff_copy():
"""Test write a copy of striped, compressed GeoTIFF."""
def strips(page):
# return iterator over compressed tiles in page
assert not page.is_tiled
fh = page.parent.filehandle
for offset, bytecount in zip(page.dataoffsets, page.databytecounts):
fh.seek(offset)
yield fh.read(bytecount)
with TiffFile(private_file('GeoTIFF/ML_30m.tif')) as geotiff:
assert geotiff.is_geotiff
assert len(geotiff.pages) == 1
with TempFileName('_write_geotiff_copy') as fname:
with TiffWriter(
fname, byteorder=geotiff.byteorder, bigtiff=geotiff.is_bigtiff
) as tif:
page = geotiff.pages[0]
tags = page.tags
extratags = (
tags.get('ModelPixelScaleTag')._astuple(),
tags.get('ModelTiepointTag')._astuple(),
tags.get('GeoKeyDirectoryTag')._astuple(),
tags.get('GeoAsciiParamsTag')._astuple(),
tags.get('GDAL_NODATA')._astuple(),
)
tif.write(
strips(page),
shape=page.shape,
dtype=page.dtype,
rowsperstrip=page.rowsperstrip,
photometric=page.photometric,
planarconfig=page.planarconfig,
compression=page.compression,
predictor=page.predictor,
jpegtables=page.jpegtables,
subsampling=page.subsampling,
extratags=extratags,
)
with TiffFile(fname) as tif:
assert tif.is_geotiff
assert len(tif.pages) == 1
assert tif.nodata == -32767
assert tif.pages[0].tags['ModelPixelScaleTag'].value == (
30.0,
30.0,
0.0,
)
assert tif.pages[0].tags['ModelTiepointTag'].value == (
0.0,
0.0,
0.0,
1769487.0,
5439473.0,
0.0,
)
assert tif.geotiff_metadata['GeogAngularUnitsGeoKey'] == 9102
assert_array_equal(tif.asarray(), geotiff.asarray())
###############################################################################
# Test embedded TIFF files
EMBED_NAME = public_file('tifffile/test_FileHandle.bin')
EMBED_OFFSET = 7077
EMBED_SIZE = 5744
EMBED_OFFSET1 = 13820
EMBED_SIZE1 = 7936382
def assert_embed_tif(tif):
"""Assert embedded TIFF file."""
# 4 series in 6 pages
assert tif.byteorder == '<'
assert len(tif.pages) == 6
assert len(tif.series) == 4
# assert series 0 properties
series = tif.series[0]
assert series.shape == (3, 20, 20)
assert series.dtype == numpy.uint8
assert series.axes == 'IYX'
page = series.pages[0]
assert page.compression == LZW
assert page.imagewidth == 20
assert page.imagelength == 20
assert page.bitspersample == 8
assert page.samplesperpixel == 1
data = tif.asarray(series=0)
assert isinstance(data, numpy.ndarray)
assert data.shape == (3, 20, 20)
assert data.dtype == numpy.uint8
assert tuple(data[:, 9, 9]) == (19, 90, 206)
# assert series 1 properties
series = tif.series[1]
assert series.shape == (10, 10, 3)
assert series.dtype == numpy.float32
assert series.axes == 'YXS'
page = series.pages[0]
assert page.photometric == RGB
assert page.compression == LZW
assert page.imagewidth == 10
assert page.imagelength == 10
assert page.bitspersample == 32
assert page.samplesperpixel == 3
data = tif.asarray(series=1)
assert isinstance(data, numpy.ndarray)
assert data.shape == (10, 10, 3)
assert data.dtype == numpy.float32
assert round(abs(data[9, 9, 1] - 214.5733642578125), 7) == 0
# assert series 2 properties
series = tif.series[2]
assert series.shape == (20, 20, 3)
assert series.dtype == numpy.uint8
assert series.axes == 'YXS'
page = series.pages[0]
assert page.photometric == RGB
assert page.compression == LZW
assert page.imagewidth == 20
assert page.imagelength == 20
assert page.bitspersample == 8
assert page.samplesperpixel == 3
data = tif.asarray(series=2)
assert isinstance(data, numpy.ndarray)
assert data.shape == (20, 20, 3)
assert data.dtype == numpy.uint8
assert tuple(data[9, 9, :]) == (19, 90, 206)
# assert series 3 properties
series = tif.series[3]
assert series.shape == (10, 10)
assert series.dtype == numpy.float32
assert series.axes == 'YX'
page = series.pages[0]
assert page.compression == LZW
assert page.imagewidth == 10
assert page.imagelength == 10
assert page.bitspersample == 32
assert page.samplesperpixel == 1
data = tif.asarray(series=3)
assert isinstance(data, numpy.ndarray)
assert data.shape == (10, 10)
assert data.dtype == numpy.float32
assert round(abs(data[9, 9] - 223.1648712158203), 7) == 0
assert__str__(tif)
def assert_embed_micromanager(tif):
"""Assert embedded MicroManager TIFF file."""
assert tif.is_ome
assert tif.is_imagej
assert tif.is_micromanager
assert tif.byteorder == '<'
assert len(tif.pages) == 15
assert len(tif.series) == 1
# assert non-tiff micromanager_metadata
tags = tif.micromanager_metadata['Summary']
assert tags['MicroManagerVersion'] == '1.4.x dev'
assert tags['UserName'] == 'trurl'
# assert page properties
page = tif.pages[0]
assert page.is_contiguous
assert page.compression == NONE
assert page.imagewidth == 512
assert page.imagelength == 512
assert page.bitspersample == 16
assert page.samplesperpixel == 1
# two description tags
assert page.description.startswith('[a-z])(?P\d+)(?:_(s)(\d))(?:_(w)(\d))'
fnames = private_file('BBBC/BBBC006_v1_images_z_00/*.tif')
fnames += private_file('BBBC/BBBC006_v1_images_z_01/*.tif')
tifs = TiffSequence(
fnames, pattern=ptrn, categories=categories, axesorder=(1, 2, 0, 3, 4)
)
assert len(tifs) == 3072
assert tifs.shape == (16, 24, 2, 2, 2)
assert tifs.axes == 'PAZSW'
data = tifs.asarray()
assert isinstance(data, numpy.ndarray)
assert data.flags['C_CONTIGUOUS']
assert data.shape == (16, 24, 2, 2, 2, 520, 696)
assert data.dtype == numpy.uint16
assert data[8, 12, 1, 0, 1, 256, 519] == 1579
if not SKIP_ZARR:
with tifs.aszarr() as store:
assert_array_equal(data, zarr.open(store, mode='r'))
@pytest.mark.skipif(SKIP_PRIVATE or SKIP_LARGE, reason=REASON)
@pytest.mark.parametrize('tiled', [False, True])
def test_sequence_tiled(tiled):
"""Test FileSequence with tiled OME-TIFFs."""
# Dataset from https://github.com/tlambert03/tifffolder/issues/2
ptrn = re.compile(
r'\[(?P\d+) x (?P\d+)\].*(C)(\d+).*(Z)(\d+)', re.IGNORECASE
)
fnames = private_file('TiffSequenceTiled/*.tif', expand=False)
tifs = TiffSequence(fnames, pattern=ptrn)
assert len(tifs) == 60
assert tifs.shape == (2, 3, 2, 5)
assert tifs.axes == 'UVCZ'
tiled = {0: 0, 1: 1} if tiled else None
data = tifs.asarray(axestiled=tiled, is_ome=False)
assert isinstance(data, numpy.ndarray)
assert data.flags['C_CONTIGUOUS']
assert data.dtype == numpy.uint16
if tiled:
assert data.shape == (2, 5, 2 * 2560, 3 * 2160)
assert data[1, 3, 2560 + 1024, 2 * 2160 + 1024] == 596
else:
assert data.shape == (2, 3, 2, 5, 2560, 2160)
assert data[1, 2, 1, 3, 1024, 1024] == 596
if not SKIP_ZARR:
with tifs.aszarr(axestiled=tiled, is_ome=False) as store:
if tiled:
assert_array_equal(
data[1, 3, 2048:3072],
zarr.open(store, mode='r')[1, 3, 2048:3072],
)
else:
assert_array_equal(
data[1, 2, 1, 3:5],
zarr.open(store, mode='r')[1, 2, 1, 3:5],
)
@pytest.mark.skipif(SKIP_PRIVATE or SKIP_CODECS, reason=REASON)
def test_sequence_imread():
"""Test TiffSequence with imagecodecs.imread."""
fname = private_file('PNG/*.png')
pngs = TiffSequence(fname, imread=imagecodecs.imread)
assert len(pngs) == 4
assert pngs.shape == (4,)
assert pngs.axes == 'I'
data = pngs.asarray(codec=imagecodecs.png_decode)
assert data.flags['C_CONTIGUOUS']
assert data.shape == (4, 200, 200)
assert data.dtype == numpy.uint16
if not SKIP_ZARR:
with pngs.aszarr(codec=imagecodecs.png_decode) as store:
assert_array_equal(data, zarr.open(store, mode='r'))
del data
###############################################################################
# Test packages depending on tifffile
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_depend_roifile():
"""Test roifile.ImagejRoi class."""
from roifile import ImagejRoi # noqa
for roi in ImagejRoi.fromfile(private_file('imagej/IJMetadata.tif')):
assert roi == ImagejRoi.frombytes(roi.tobytes())
roi.coordinates()
roi.__str__()
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_depend_lfdfiles():
"""Test lfdfiles conversion to TIFF."""
from lfdfiles import SimfcsZ64 # noqa
filename = private_file('SimFCS/simfcs.Z64')
with TempFileName('simfcsz_z64', ext='.tif') as outfile:
with SimfcsZ64(filename) as z64:
data = z64.asarray()
z64.totiff(outfile)
with TiffFile(outfile) as tif:
assert len(tif.pages) == 256
assert len(tif.series) == 1
assert tif.series[0].shape == (256, 256, 256)
assert tif.series[0].dtype == numpy.float32
assert_array_equal(data, tif.asarray())
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_depend_cmapfile():
"""Test cmapfile.lsm2cmap."""
from cmapfile import CmapFile, lsm2cmap # noqa
filename = private_file('LSM/3d_zfish_onephoton_zoom.lsm')
data = imread(filename)
with TempFileName('cmapfile', ext='.cmap') as cmapfile:
lsm2cmap(filename, cmapfile, step=(1.0, 1.0, 20.0))
fname = os.path.join(
os.path.split(cmapfile)[0], 'test_cmapfile.ch0000.cmap'
)
with CmapFile(fname, mode='r') as cmap:
assert_array_equal(
cmap['map00000']['data00000'], data.squeeze()[:, 0, :, :]
)
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_depend_czifile():
"""Test czifile.CziFile."""
# TODO: test LZW compressed czi file
from czifile import CziFile
fname = private_file('czi/pollen.czi')
with CziFile(fname) as czi:
assert czi.shape == (1, 1, 104, 365, 364, 1)
assert czi.axes == 'TCZYX0'
# verify data
data = czi.asarray()
assert data.flags['C_CONTIGUOUS']
assert data.shape == (1, 1, 104, 365, 364, 1)
assert data.dtype == numpy.uint8
assert data[0, 0, 52, 182, 182, 0] == 10
@pytest.mark.skipif(SKIP_PRIVATE or SKIP_LARGE, reason=REASON)
def test_depend_czi2tif():
"""Test czifile.czi2tif."""
from czifile.czifile import CziFile, czi2tif
fname = private_file('CZI/pollen.czi')
with CziFile(fname) as czi:
metadata = czi.metadata()
data = czi.asarray().squeeze()
with TempFileName('czi2tif') as tif:
czi2tif(fname, tif, bigtiff=False)
with TiffFile(tif) as t:
im = t.asarray()
assert t.pages[0].description == metadata
assert_array_equal(im, data)
del im
del data
assert_valid_tiff(tif)
@pytest.mark.skipif(SKIP_PRIVATE or SKIP_LARGE, reason=REASON)
def test_depend_czi2tif_airy():
"""Test czifile.czi2tif with AiryScan."""
from czifile.czifile import czi2tif
fname = private_file('CZI/AiryscanSRChannel.czi')
with TempFileName('czi2tif_airy') as tif:
czi2tif(fname, tif, verbose=True, truncate=True, bigtiff=False)
im = memmap(tif)
assert im.shape == (32, 6, 1680, 1680)
assert tuple(im[17, :, 1500, 1000]) == (95, 109, 3597, 0, 0, 0)
del im
assert_valid_tiff(tif)
@pytest.mark.skipif(SKIP_PRIVATE, reason=REASON)
def test_depend_oiffile():
"""Test oiffile.OifFile."""
from oiffile import OifFile
fname = private_file(
'oib/MB231cell1_paxgfp_PDMSgasket_PMMAflat_30nm_378sli.oib'
)
with OifFile(fname) as oib:
assert oib.is_oib
tifs = oib.series[0]
assert len(tifs) == 756
assert tifs.shape == (2, 378)
assert tifs.axes == 'CZ'
# verify data
data = tifs.asarray(out='memmap')
assert data.flags['C_CONTIGUOUS']
assert data.shape == (2, 378, 256, 256)
assert data.dtype == numpy.dtype('