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)
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)
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)
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)