rasterio/tests/test_colorinterp.py
2021-10-22 09:04:05 -06:00

101 lines
3.1 KiB
Python

"""Tests for interacting with color interpretation."""
import pytest
import rasterio
from rasterio.enums import ColorInterp
from .conftest import requires_gdal22
def test_cmyk_interp(tmpdir):
"""A CMYK TIFF has cyan, magenta, yellow, black bands."""
with rasterio.open('tests/data/RGB.byte.tif') as src:
profile = src.profile
profile['photometric'] = 'cmyk'
profile['count'] = 4
tiffname = str(tmpdir.join('foo.tif'))
with rasterio.open(tiffname, 'w', **profile) as dst:
assert dst.profile['count'] == 4
assert dst.colorinterp == (
ColorInterp.cyan,
ColorInterp.magenta,
ColorInterp.yellow,
ColorInterp.black)
@requires_gdal22(reason="Some versions prior to 2.2.2 segfault on a Mac OSX "
"Homebrew GDAL")
def test_ycbcr_interp(tmpdir):
"""A YCbCr TIFF has red, green, blue bands."""
with rasterio.open('tests/data/RGB.byte.tif') as src:
meta = src.meta
meta['photometric'] = 'ycbcr'
meta['compress'] = 'jpeg'
meta['count'] = 3
tiffname = str(tmpdir.join('foo.tif'))
with rasterio.open(tiffname, 'w', **meta) as dst:
assert dst.colorinterp == (
ColorInterp.red, ColorInterp.green, ColorInterp.blue)
@pytest.mark.parametrize("dtype", [rasterio.ubyte, rasterio.int16])
def test_set_colorinterp(path_rgba_byte_tif, tmpdir, dtype):
"""Test setting color interpretation by creating an image without CI
and then setting to unusual values. Also test with a non-uint8 image.
"""
no_ci_path = str(tmpdir.join('no-ci.tif'))
with rasterio.open(path_rgba_byte_tif) as src:
meta = src.meta.copy()
meta.update(
height=10,
width=10,
dtype=dtype,
photometric='minisblack',
alpha='unspecified')
with rasterio.open(no_ci_path, 'w', **meta):
pass
# This is should be the default color interpretation of the copied
# image. GDAL defines these defaults, not Rasterio.
src_ci = (
ColorInterp.gray,
ColorInterp.undefined,
ColorInterp.undefined,
ColorInterp.undefined)
dst_ci = (
ColorInterp.alpha,
ColorInterp.blue,
ColorInterp.green,
ColorInterp.red)
with rasterio.open(no_ci_path, 'r+') as src:
assert src.colorinterp == src_ci
src.colorinterp = dst_ci
# See note in 'test_set_colorinterp_undefined'. Opening a second
# time catches situations like that.
with rasterio.open(no_ci_path) as src:
assert src.colorinterp == dst_ci
@pytest.mark.parametrize("ci", ColorInterp.__members__.values())
def test_set_colorinterp_all(path_4band_no_colorinterp, ci):
"""Test setting with all color interpretations."""
if ci.value == 1:
pytest.xfail("Setting colorinterp to gray fails with GDAL 2.3, see https://github.com/rasterio/rasterio/issues/1234")
with rasterio.open(path_4band_no_colorinterp, 'r+') as src:
all_ci = list(src.colorinterp)
all_ci[1] = ci
src.colorinterp = all_ci
with rasterio.open(path_4band_no_colorinterp) as src:
assert src.colorinterp[1] == ci