Пример #1
0
def curve_to_lut(colorspace, gamma, outlutfile, out_type=None, out_format=None,
                 input_range=None, output_range=None, out_bit_depth=None,
                 out_cube_size=None, verbose=False, direction=Direction.ENCODE,
                 preset=None, overwrite_preset=False,
                 process_input_range=False):
    """Export a LUT from a colorspace gradation function

    Args:
        colorspace (str): input colorspace. Mutually exclusive with gamma.
        See list of colorspaces in utils.colorspaces

        gamma (float): input gamma. Mutually exclusive with colorspace.

        out_type (str): 1D, 2D or 3D

        out_format (str): '3dl', 'csp', 'cube', 'lut', 'spi', 'clcc', 'json'...

        outlutfile (str): path to output LUT

    Kwargs:

        input_range ([int/float, int/float]): input range.
        Ex: [0.0, 1.0] or [0, 4095]

        output_range ([int/float, int/float]): output range.
        Ex: [0.0, 1.0] or [0, 4095]

        out_bit_depth (int): output lut bit precision (1D only).
        Ex : 10, 16, 32.

        out_cube_size (int): output cube size (3D only). Ex : 17, 32.

        verbose (bool): print log if true

        direction (Direction): encode or decode

        preset (dict): lut generic and sampling informations

        process_input_range (bool): If true, input range will be computed from
        colorspace gradation functions. Colorspace only"

    """
    # get colorspace function
    if colorspace is None and gamma is None:
        raise AttributeError("A colorspace or a gamma should be specified")
    if colorspace is not None and gamma is not None:
        raise AttributeError("Choose between a colorspace or a gamma")
    elif gamma is not None:
        # gamma mode
        if direction == Direction.DECODE:
            gradation = lambda value: gamma_to_lin(value, gamma)
            title = "Gamma{0}_to_lin".format(gamma)
        else:
            gradation = lambda value: lin_to_gamma(value, gamma)
            title = "Lin_to_gamma{0}".format(gamma)
    else:
        # colorspace mode
        try:
            colorspace_obj = dict(list(COLORSPACES.items()) +
                                  list(PRIVATE_COLORSPACES.items()))[colorspace]
        except KeyError:
            raise CurveToLUTException(("Unsupported {0} "
                                       "Colorspace!").format(colorspace))
        if direction == Direction.DECODE:
            gradation = colorspace_obj.decode_gradation
            title = "{0}_to_lin".format(colorspace)
        else:
            gradation = colorspace_obj.encode_gradation
            title = "Lin_to_{0}".format(colorspace)
    # get preset and write function
    if preset:
        write_function = get_write_function(preset, overwrite_preset,
                                            out_type, out_format,
                                            input_range,
                                            output_range,
                                            out_bit_depth,
                                            out_cube_size,
                                            verbose)
    elif out_type is None or out_format is None:
        raise CurveToLUTException("Specify out_type/out_format or a preset.")
    else:
        preset, write_function = get_preset_and_write_function(out_type,
                                                               out_format,
                                                               input_range,
                                                               output_range,
                                                               out_bit_depth,
                                                               out_cube_size)
    if preset[presets.TYPE] == '3D':
        print_warning_message(("Gradations and gamma functions are 1D / 2D"
                               " transformations. Baking them in a 3D LUT "
                               "may not be efficient. Are you sure ?"))
    # process file output
    if os.path.isdir(outlutfile):
        filename = "{0}{1}".format(title,
                                   preset[presets.EXT])
        outlutfile = os.path.join(outlutfile, filename)
    else:
        try:
            check_extension(outlutfile, preset[presets.EXT])
            outlutfile = outlutfile
        except LUTException as error:
            raise CurveToLUTException(("Directory doesn't exist "
                                       "or {0}").format(error))
    preset[presets.TITLE] = title
    if process_input_range:
        if colorspace:
            preset[presets.IN_RANGE] = get_input_range(colorspace_obj,
                                                       direction,
                                                       8)
        else:
            raise CurveToLUTException(("--process-input-range must be used"
                                       " with --colorspace."))
    if verbose:
        print("{0} will be written in {1}.".format(title, outlutfile))
        print("Final setting:\n{0}".format(presets.string_preset(preset)))
    # write
    message = write_function(gradation, outlutfile, preset)
    if verbose:
        print_success_message(message)
Пример #2
0
def curve_to_lut(colorspace, outlutpath, lut_type='1D_CUBE',
                 lut_range=None, lutsize=16, direction=Direction.ENCODE):
    """Export a LUT from a colorspace gradation function

    Args:
        colorspace (str): input colorspace

        lut_type (str): 1D_CUBE, 1D_CSP, 1D_SPI

        lut_range ([float, float]): LUT range boundaries

        lutsize (int): out LUT bit precision for 1D. Ex : 16 (bits)

        direction (Direction): encode or decode

    """
    # init
    if not lut_range:
        lut_range = [0, 1]
    samples_count = pow(2, lutsize)
    if lut_type == '1D_CUBE':
        ext = ".cube"
        write_function = write_1d_cube_lut
    elif lut_type == '1D_CSP':
        ext = ".csp"
        write_function = write_1d_csp_lut
    elif lut_type == '1D_SPI':
        ext = ".spi1d"
        write_function = lambda lutfile, values: write_1d_spi_lut(lutfile,
                                                                  values,
                                                                  lut_range)
    else:
        raise CurveToLUTException(("Unsupported export "
                                   "format: {0}").format(lut_type))
    # process file output
    if os.path.isdir(outlutpath):
        filename = "{0}_{1}{2}".format(direction, colorspace, ext)
        outlutfile = os.path.join(outlutpath, filename)
    else:
        try:
            check_extension(outlutpath, ext)
            outlutfile = outlutpath
        except LUTException as error:
            raise CurveToLUTException(("Directory doesn't exist "
                                       "or {0}").format(error))
    # get colorspace function
    try:
        colorspace_obj = (COLORSPACES.items() +
                          PRIVATE_COLORSPACES.items())[colorspace]
    except KeyError:
        raise CurveToLUTException(("Unsupported {0} "
                                   "Colorspace!").format(colorspace))
    if direction == Direction.DECODE:
        gradation = colorspace_obj.decode_gradation
    else:
        gradation = colorspace_obj.encode_gradation
    # create range
    input_range = linspace(lut_range[0], lut_range[1], samples_count)
    output_range = []
    for x in input_range:
        y = gradation(x)
        output_range.append(y)
    write_function(outlutfile, output_range)
    print "{0} was converted into {1}.".format(colorspace, outlutfile)
Пример #3
0
def curve_to_lut(colorspace,
                 outlutpath,
                 lut_type='1D_CUBE',
                 lut_range=None,
                 lutsize=16,
                 direction=Direction.ENCODE):
    """Export a LUT from a colorspace gradation function

    Args:
        colorspace (str): input colorspace

        lut_type (str): 1D_CUBE, 1D_CSP, 1D_SPI

        lut_range ([float, float]): LUT range boundaries

        lutsize (int): out LUT bit precision for 1D. Ex : 16 (bits)

        direction (Direction): encode or decode

    """
    # init
    if not lut_range:
        lut_range = [0, 1]
    samples_count = pow(2, lutsize)
    if lut_type == '1D_CUBE':
        ext = ".cube"
        write_function = write_1d_cube_lut
    elif lut_type == '1D_CSP':
        ext = ".csp"
        write_function = write_1d_csp_lut
    elif lut_type == '1D_SPI':
        ext = ".spi1d"
        write_function = lambda lutfile, values: write_1d_spi_lut(
            lutfile, values, lut_range)
    else:
        raise CurveToLUTException(("Unsupported export "
                                   "format: {0}").format(lut_type))
    # process file output
    if os.path.isdir(outlutpath):
        filename = "{0}_{1}{2}".format(direction, colorspace, ext)
        outlutfile = os.path.join(outlutpath, filename)
    else:
        try:
            check_extension(outlutpath, ext)
            outlutfile = outlutpath
        except LUTException as error:
            raise CurveToLUTException(("Directory doesn't exist "
                                       "or {0}").format(error))
    # get colorspace function
    try:
        colorspace_obj = (COLORSPACES.items() +
                          PRIVATE_COLORSPACES.items())[colorspace]
    except KeyError:
        raise CurveToLUTException(("Unsupported {0} "
                                   "Colorspace!").format(colorspace))
    if direction == Direction.DECODE:
        gradation = colorspace_obj.decode_gradation
    else:
        gradation = colorspace_obj.encode_gradation
    # create range
    input_range = linspace(lut_range[0], lut_range[1], samples_count)
    output_range = []
    for x in input_range:
        y = gradation(x)
        output_range.append(y)
    write_function(outlutfile, output_range)
    print "{0} was converted into {1}.".format(colorspace, outlutfile)
Пример #4
0
def curve_to_lut(colorspace, gamma, outlutfile, out_type=None, out_format=None,
                 input_range=None, output_range=None, out_bit_depth=None,
                 out_cube_size=None, verbose=False, direction=Direction.ENCODE,
                 preset=None, overwrite_preset=False,
                 process_input_range=False):
    """Export a LUT from a colorspace gradation function

    Args:
        colorspace (str): input colorspace. Mutually exclusive with gamma.
        See list of colorspaces in utils.colorspaces

        gamma (float): input gamma. Mutually exclusive with colorspace.

        out_type (str): 1D, 2D or 3D

        out_format (str): '3dl', 'csp', 'cube', 'lut', 'spi', 'clcc', 'json'...

        outlutfile (str): path to output LUT

    Kwargs:

        input_range ([int/float, int/float]): input range.
        Ex: [0.0, 1.0] or [0, 4095]

        output_range ([int/float, int/float]): output range.
        Ex: [0.0, 1.0] or [0, 4095]

        out_bit_depth (int): output lut bit precision (1D only).
        Ex : 10, 16, 32.

        out_cube_size (int): output cube size (3D only). Ex : 17, 32.

        verbose (bool): print log if true

        direction (Direction): encode or decode

        preset (dict): lut generic and sampling informations

        process_input_range (bool): If true, input range will be computed from
        colorspace gradation functions. Colorspace only"

    """
    # get colorspace function
    if colorspace is None and gamma is None:
        raise AttributeError("A colorspace or a gamma should be specified")
    if colorspace is not None and gamma is not None:
        raise AttributeError("Choose between a colorspace or a gamma")
    elif gamma is not None:
        # gamma mode
        if direction == Direction.DECODE:
            gradation = lambda value: gamma_to_lin(value, gamma)
            title = "Gamma{0}_to_lin".format(gamma)
        else:
            gradation = lambda value: lin_to_gamma(value, gamma)
            title = "Lin_to_gamma{0}".format(gamma)
    else:
        # colorspace mode
        try:
            colorspace_obj = dict(COLORSPACES.items() +
                                  PRIVATE_COLORSPACES.items())[colorspace]
        except KeyError:
            raise CurveToLUTException(("Unsupported {0} "
                                       "Colorspace!").format(colorspace))
        if direction == Direction.DECODE:
            gradation = colorspace_obj.decode_gradation
            title = "{0}_to_lin".format(colorspace)
        else:
            gradation = colorspace_obj.encode_gradation
            title = "Lin_to_{0}".format(colorspace)
    # get preset and write function
    if preset:
        write_function = get_write_function(preset, overwrite_preset,
                                            out_type, out_format,
                                            input_range,
                                            output_range,
                                            out_bit_depth,
                                            out_cube_size,
                                            verbose)
    elif out_type is None or out_format is None:
        raise CurveToLUTException("Specify out_type/out_format or a preset.")
    else:
        preset, write_function = get_preset_and_write_function(out_type,
                                                               out_format,
                                                               input_range,
                                                               output_range,
                                                               out_bit_depth,
                                                               out_cube_size)
    if preset[presets.TYPE] == '3D':
        print_warning_message(("Gradations and gamma functions are 1D / 2D"
                               " transformations. Baking them in a 3D LUT "
                               "may not be efficient. Are you sure ?"))
    # process file output
    if os.path.isdir(outlutfile):
        filename = "{0}{1}".format(title,
                                   preset[presets.EXT])
        outlutfile = os.path.join(outlutfile, filename)
    else:
        try:
            check_extension(outlutfile, preset[presets.EXT])
            outlutfile = outlutfile
        except LUTException as error:
            raise CurveToLUTException(("Directory doesn't exist "
                                       "or {0}").format(error))
    preset[presets.TITLE] = title
    if process_input_range:
        if colorspace:
            preset[presets.IN_RANGE] = get_input_range(colorspace_obj,
                                                       direction,
                                                       8)
        else:
            raise CurveToLUTException(("--process-input-range must be used"
                                       " with --colorspace."))
    if verbose:
        print "{0} will be written in {1}.".format(title, outlutfile)
        print "Final setting:\n{0}".format(presets.string_preset(preset))
    # write
    message = write_function(gradation, outlutfile, preset)
    if verbose:
        print_success_message(message)