Source code for colour.io.ocio

"""
OpenColorIO Processing
======================

Defines the object for *OpenColorIO* processing:

-   :func:`colour.io.process_image_OpenColorIO`
"""

from __future__ import annotations

import numpy as np

from colour.hints import Any, ArrayLike, NDArray
from colour.utilities import as_float_array, required

__author__ = "Colour Developers"
__copyright__ = "Copyright 2013 Colour Developers"
__license__ = "New BSD License - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"

__all__ = [
    "process_image_OpenColorIO",
]


[docs]@required("OpenColorIO") def process_image_OpenColorIO( a: ArrayLike, *args: Any, **kwargs: Any ) -> NDArray: """ Process given image with *OpenColorIO*. Parameters ---------- a Image to process with *OpenColorIO*. Other Parameters ---------------- config *OpenColorIO* config to use for processing. If not defined, the *OpenColorIO* set defined by the ``$OCIO`` environment variable is used. args Arguments for `Config.getProcessor` method. See https://opencolorio.readthedocs.io/en/latest/api/config.html for more information. Returns ------- :class:`numpy.ndarray` Processed image. Examples -------- # TODO: Reinstate when "Pypi" wheel compatible with "ARM" on "macOS" is # released. >>> import os >>> import PyOpenColorIO as ocio # doctest: +SKIP >>> from colour.utilities import full >>> config = os.path.join( ... os.path.dirname(__file__), 'tests', 'resources', ... 'config-aces-reference.ocio.yaml') >>> a = full([4, 2, 3], 0.18) >>> process_image_OpenColorIO( # doctest: +SKIP ... a, 'ACES - ACES2065-1', 'ACES - ACEScct', config=config) array([[[ 0.4135878..., 0.4135878..., 0.4135878...], [ 0.4135878..., 0.4135878..., 0.4135878...]], <BLANKLINE> [[ 0.4135878..., 0.4135878..., 0.4135878...], [ 0.4135878..., 0.4135878..., 0.4135878...]], <BLANKLINE> [[ 0.4135878..., 0.4135878..., 0.4135878...], [ 0.4135878..., 0.4135878..., 0.4135878...]], <BLANKLINE> [[ 0.4135878..., 0.4135878..., 0.4135878...], [ 0.4135878..., 0.4135878..., 0.4135878...]]], dtype=float32) >>> process_image_OpenColorIO( # doctest: +SKIP ... a, 'ACES - ACES2065-1', 'Display - sRGB', ... 'Output - SDR Video - ACES 1.0', ocio.TRANSFORM_DIR_FORWARD, ... config=config) array([[[ 0.3559523..., 0.3559525..., 0.3559525...], [ 0.3559523..., 0.3559525..., 0.3559525...]], <BLANKLINE> [[ 0.3559523..., 0.3559525..., 0.3559525...], [ 0.3559523..., 0.3559525..., 0.3559525...]], <BLANKLINE> [[ 0.3559523..., 0.3559525..., 0.3559525...], [ 0.3559523..., 0.3559525..., 0.3559525...]], <BLANKLINE> [[ 0.3559523..., 0.3559525..., 0.3559525...], [ 0.3559523..., 0.3559525..., 0.3559525...]]], dtype=float32) """ import PyOpenColorIO as ocio config = kwargs.get("config") config = ( ocio.Config.CreateFromEnv() if config is None else ocio.Config.CreateFromFile(config) ) a = as_float_array(np.atleast_3d(a), dtype=np.float32) height, width, channels = a.shape processor = config.getProcessor(*args).getDefaultCPUProcessor() image_desc = ocio.PackedImageDesc(a, width, height, channels) processor.apply(image_desc) return image_desc.getData().reshape([height, width, channels])