# -*- coding: utf-8 -*-
"""
-Defines objects to generate various kind of 1d, 2d and 3d LUTs in various file
+Defines objects to generate various kind of 1D and 3D LUTs in various file
formats.
"""
import array
import os
-import sys
import OpenImageIO as oiio
__all__ = ['generate_1d_LUT_image',
'write_SPI_1d',
+ 'write_CSP_1d',
+ 'write_CTL_1d',
+ 'write_1d',
'generate_1d_LUT_from_image',
'generate_3d_LUT_image',
'generate_3d_LUT_from_image',
min_value=0,
max_value=1):
"""
- Object description.
+ Generates a 1D LUT image, i.e. a simple ramp, going from the min_value to
+ the max_value.
Parameters
----------
- parameter : type
- Parameter description.
+ ramp_1d_path : str or unicode
+ The path of the 1D ramp image to be written
+ resolution : int, optional
+ The resolution of the 1D ramp image to be written
+ min_value : float, optional
+ The lowest value in the 1D ramp
+ max_value : float, optional
+ The highest value in the 1D ramp
Returns
-------
- type
- Return value description.
+ None
"""
ramp = oiio.ImageOutput.create(ramp_1d_path)
ramp.close()
-def write_SPI_1d(filename,
- from_min,
- from_max,
- data,
- entries,
- channels,
+def write_SPI_1d(filename,
+ from_min,
+ from_max,
+ data,
+ entries,
+ channels,
components=3):
"""
- Object description.
+ Writes a 1D LUT in the Sony Pictures Imageworks .spi1d format.
Credit to *Alex Fry* for the original single channel version of the spi1d
writer.
Parameters
----------
- parameter : type
- Parameter description.
+ filename : str or unicode
+ The path of the 1D LUT to be written
+ from_min : float
+ The lowest value in the 1D ramp
+ from_max : float
+ The highest value in the 1D ramp
+ data : array of floats
+ The entries in the LUT
+ entries : int
+ The resolution of the LUT, i.e. number of entries in the data set
+ channels : int
+ The number of channels in the data
+ components : int, optional
+ The number of channels in the data to actually write
Returns
-------
- type
- Return value description.
+ None
"""
# May want to use fewer components than there are channels in the data
fp.write('}\n')
-def write_CSP_1d(filename,
- from_min,
- from_max,
- data,
- entries,
- channels,
+def write_CSP_1d(filename,
+ from_min,
+ from_max,
+ data,
+ entries,
+ channels,
components=3):
"""
- Object description.
+ Writes a 1D LUT in the Rising Sun Research Cinespace .csp format.
Parameters
----------
- parameter : type
- Parameter description.
+ filename : str or unicode
+ The path of the 1D LUT to be written
+ from_min : float
+ The lowest value in the 1D ramp
+ from_max : float
+ The highest value in the 1D ramp
+ data : array of floats
+ The entries in the LUT
+ entries : int
+ The resolution of the LUT, i.e. number of entries in the data set
+ channels : int
+ The number of channels in the data
+ components : int, optional
+ The number of channels in the data to actually write
Returns
-------
- type
- Return value description.
+ None
"""
# May want to use fewer components than there are channels in the data
fp.write('%d\n' % entries)
if components == 1:
- for i in range(0, entries):
- entry = ''
- for j in range(3):
- entry = '%s %s' % (entry, data[i * channels])
- fp.write('%s\n' % entry)
+ for i in range(0, entries):
+ entry = ''
+ for j in range(3):
+ entry = '%s %s' % (entry, data[i * channels])
+ fp.write('%s\n' % entry)
else:
- for i in range(entries):
- entry = ''
- for j in range(components):
- entry = '%s %s' % (entry, data[i * channels + j])
- fp.write('%s\n' % entry)
+ for i in range(entries):
+ entry = ''
+ for j in range(components):
+ entry = '%s %s' % (entry, data[i * channels + j])
+ fp.write('%s\n' % entry)
fp.write('\n')
-def write_CTL_1d(filename,
- from_min,
- from_max,
- data,
- entries,
- channels,
+
+def write_CTL_1d(filename,
+ from_min,
+ from_max,
+ data,
+ entries,
+ channels,
components=3):
"""
- Object description.
+ Writes a 1D LUT in the Academy Color Transformation Language .ctl format.
Parameters
----------
- parameter : type
- Parameter description.
+ filename : str or unicode
+ The path of the 1D LUT to be written
+ from_min : float
+ The lowest value in the 1D ramp
+ from_max : float
+ The highest value in the 1D ramp
+ data : array of floats
+ The entries in the LUT
+ entries : int
+ The resolution of the LUT, i.e. number of entries in the data set
+ channels : int
+ The number of channels in the data
+ components : int, optional
+ The number of channels in the data to actually write
Returns
-------
- type
- Return value description.
+ None
"""
# May want to use fewer components than there are channels in the data
with open(filename, 'w') as fp:
fp.write('// %d x %d LUT generated by "generate_lut"\n' % (
- entries, components))
+ entries, components))
fp.write('\n')
fp.write('const float min1d = %3.9f;\n' % from_min)
fp.write('const float max1d = %3.9f;\n' % from_max)
# Write LUT
if components == 1:
- fp.write('const float lut[] = {\n')
- for i in range(0, entries):
- fp.write('%s' % data[i * channels])
- if i != (entries-1):
- fp.write(',')
- fp.write('\n')
- fp.write('};\n')
- fp.write('\n')
- else:
- for j in range(components):
- fp.write('const float lut%d[] = {\n' % j)
+ fp.write('const float lut[] = {\n')
for i in range(0, entries):
fp.write('%s' % data[i * channels])
- if i != (entries-1):
- fp.write(',')
+ if i != (entries - 1):
+ fp.write(',')
fp.write('\n')
fp.write('};\n')
fp.write('\n')
+ else:
+ for j in range(components):
+ fp.write('const float lut%d[] = {\n' % j)
+ for i in range(0, entries):
+ fp.write('%s' % data[i * channels])
+ if i != (entries - 1):
+ fp.write(',')
+ fp.write('\n')
+ fp.write('};\n')
+ fp.write('\n')
fp.write('void main\n')
fp.write('(\n')
fp.write('\n')
fp.write(' // Apply LUT\n')
if components == 1:
- fp.write(' r = lookup1D(lut, min1d, max1d, r);\n')
- fp.write(' g = lookup1D(lut, min1d, max1d, g);\n')
- fp.write(' b = lookup1D(lut, min1d, max1d, b);\n')
+ fp.write(' r = lookup1D(lut, min1d, max1d, r);\n')
+ fp.write(' g = lookup1D(lut, min1d, max1d, g);\n')
+ fp.write(' b = lookup1D(lut, min1d, max1d, b);\n')
elif components == 3:
- fp.write(' r = lookup1D(lut0, min1d, max1d, r);\n')
- fp.write(' g = lookup1D(lut1, min1d, max1d, g);\n')
- fp.write(' b = lookup1D(lut2, min1d, max1d, b);\n')
+ fp.write(' r = lookup1D(lut0, min1d, max1d, r);\n')
+ fp.write(' g = lookup1D(lut1, min1d, max1d, g);\n')
+ fp.write(' b = lookup1D(lut2, min1d, max1d, b);\n')
fp.write('\n')
fp.write(' rOut = r;\n')
fp.write(' gOut = g;\n')
fp.write(' aOut = aIn;\n')
fp.write('}\n')
-def write_1d(filename,
- from_min,
- from_max,
- data,
- data_entries,
- data_channels,
+
+def write_1d(filename,
+ from_min,
+ from_max,
+ data,
+ data_entries,
+ data_channels,
lut_components=3,
format='spi1d'):
"""
- Object description.
+ Writes a 1D LUT in the specified format.
Parameters
----------
- parameter : type
- Parameter description.
+ filename : str or unicode
+ The path of the 1D LUT to be written
+ from_min : float
+ The lowest value in the 1D ramp
+ from_max : float
+ The highest value in the 1D ramp
+ data : array of floats
+ The entries in the LUT
+ data_entries : int
+ The resolution of the LUT, i.e. number of entries in the data set
+ data_channels : int
+ The number of channels in the data
+ lut_components : int, optional
+ The number of channels in the data to actually use when writing
+ format : str or unicode, optional
+ The format of the the 1D LUT that will be written
Returns
-------
- type
- Return value description.
+ None
"""
- ocioFormatsToExtensions = {'cinespace' : 'csp',
- 'flame' : '3dl',
- 'icc' : 'icc',
- 'houdini' : 'lut',
- 'lustre' : '3dl',
- 'ctl' : 'ctl'}
-
- if format in ocioFormatsToExtensions:
- if ocioFormatsToExtensions[format] == 'csp':
- write_CSP_1d(filename,
- from_min,
- from_max,
- data,
- data_entries,
- data_channels,
- lut_components)
- elif ocioFormatsToExtensions[format] == 'ctl':
- write_CTL_1d(filename,
+ ocio_formats_to_extensions = {'cinespace': 'csp',
+ 'flame': '3dl',
+ 'icc': 'icc',
+ 'houdini': 'lut',
+ 'lustre': '3dl',
+ 'ctl': 'ctl'}
+
+ if format in ocio_formats_to_extensions:
+ if ocio_formats_to_extensions[format] == 'csp':
+ write_CSP_1d(filename,
+ from_min,
+ from_max,
+ data,
+ data_entries,
+ data_channels,
+ lut_components)
+ elif ocio_formats_to_extensions[format] == 'ctl':
+ write_CTL_1d(filename,
+ from_min,
+ from_max,
+ data,
+ data_entries,
+ data_channels,
+ lut_components)
+ else:
+ write_SPI_1d(filename,
from_min,
from_max,
data,
data_entries,
data_channels,
lut_components)
- else:
- write_SPI_1d(filename,
- from_min,
- from_max,
- data,
- data_entries,
- data_channels,
- lut_components)
+
def generate_1d_LUT_from_image(ramp_1d_path,
output_path=None,
channels=3,
format='spi1d'):
"""
- Object description.
+ Reads a 1D LUT image and writes a 1D LUT in the specified format.
Parameters
----------
- parameter : type
- Parameter description.
+ ramp_1d_path : str or unicode
+ The path of the 1D ramp image to be read
+ output_path : str or unicode, optional
+ The path of the 1D LUT to be written
+ min_value : float, optional
+ The lowest value in the 1D ramp
+ max_value : float, optional
+ The highest value in the 1D ramp
+ channels : int, optional
+ The number of channels in the data
+ format : str or unicode, optional
+ The format of the the 1D LUT that will be written
Returns
-------
- type
- Return value description.
+ None
"""
if output_path is None:
type = oiio.FLOAT
ramp_data = ramp.read_image(type)
- write_1d(output_path, min_value, max_value,
- ramp_data, ramp_width, ramp_channels, channels, format)
+ write_1d(output_path, min_value, max_value,
+ ramp_data, ramp_width, ramp_channels, channels, format)
def generate_3d_LUT_image(ramp_3d_path, resolution=32):
"""
- Object description.
+ Generates a 3D LUT image covering the specified resolution
+ Relies on OCIO's ociolutimage command
Parameters
----------
- parameter : type
- Parameter description.
+ ramp_3d_path : str or unicode
+ The path of the 3D ramp image to be written
+ resolution : int, optional
+ The resolution of the 3D ramp image to be written
Returns
-------
- type
- Return value description.
+ None
"""
args = ['--generate',
lut_extract.execute()
-def generate_3d_LUT_from_image(ramp_3d_path,
- output_path=None,
+def generate_3d_LUT_from_image(ramp_3d_path,
+ output_path=None,
resolution=32,
format='spi3d'):
"""
- Object description.
+ Reads a 3D LUT image and writes a 3D LUT in the specified format.
+ Relies on OCIO's ociolutimage command
Parameters
----------
- parameter : type
- Parameter description.
+ ramp_3d_path : str or unicode
+ The path of the 3D ramp image to be read
+ output_path : str or unicode, optional
+ The path of the 1D LUT to be written
+ resolution : int, optional
+ The resolution of the 3D LUT represented in the image
+ format : str or unicode, optional
+ The format of the the 3D LUT that will be written
Returns
-------
- type
- Return value description.
+ None
"""
if output_path is None:
output_path = '%s.%s' % (ramp_3d_path, 'spi3d')
- ocioFormatsToExtensions = {'cinespace' : 'csp',
- 'flame' : '3dl',
- 'icc' : 'icc',
- 'houdini' : 'lut',
- 'lustre' : '3dl'}
-
- if format == 'spi3d' or not (format in ocioFormatsToExtensions):
- # Extract a spi3d LUT
- args = ['--extract',
- '--cubesize',
- str(resolution),
- '--maxwidth',
- str(resolution * resolution),
- '--input',
- ramp_3d_path,
- '--output',
- output_path]
- lut_extract = Process(description='extract a 3d LUT',
- cmd='ociolutimage',
- args=args)
- lut_extract.execute()
+ ocio_formats_to_extensions = {'cinespace': 'csp',
+ 'flame': '3dl',
+ 'icc': 'icc',
+ 'houdini': 'lut',
+ 'lustre': '3dl'}
+
+ if format == 'spi3d' or not (format in ocio_formats_to_extensions):
+ # Extract a spi3d LUT
+ args = ['--extract',
+ '--cubesize',
+ str(resolution),
+ '--maxwidth',
+ str(resolution * resolution),
+ '--input',
+ ramp_3d_path,
+ '--output',
+ output_path]
+ lut_extract = Process(description='extract a 3d LUT',
+ cmd='ociolutimage',
+ args=args)
+ lut_extract.execute()
else:
- output_path_spi3d = '%s.%s' % (output_path, 'spi3d')
-
- # Extract a spi3d LUT
- args = ['--extract',
- '--cubesize',
- str(resolution),
- '--maxwidth',
- str(resolution * resolution),
- '--input',
- ramp_3d_path,
- '--output',
- output_path_spi3d]
- lut_extract = Process(description='extract a 3d LUT',
- cmd='ociolutimage',
- args=args)
- lut_extract.execute()
-
- # Convert to a different format
- args = ['--lut',
- output_path_spi3d,
- '--format',
- format,
- output_path]
- lut_convert = Process(description='convert a 3d LUT',
- cmd='ociobakelut',
- args=args)
- lut_convert.execute()
+ output_path_spi3d = '%s.%s' % (output_path, 'spi3d')
+
+ # Extract a spi3d LUT
+ args = ['--extract',
+ '--cubesize',
+ str(resolution),
+ '--maxwidth',
+ str(resolution * resolution),
+ '--input',
+ ramp_3d_path,
+ '--output',
+ output_path_spi3d]
+ lut_extract = Process(description='extract a 3d LUT',
+ cmd='ociolutimage',
+ args=args)
+ lut_extract.execute()
+
+ # Convert to a different format
+ args = ['--lut',
+ output_path_spi3d,
+ '--format',
+ format,
+ output_path]
+ lut_convert = Process(description='convert a 3d LUT',
+ cmd='ociobakelut',
+ args=args)
+ lut_convert.execute()
def apply_CTL_to_image(input_image,
global_params=None,
aces_ctl_directory=None):
"""
- Object description.
+ Applies a set of Academy Color Transformation Language .ctl files to
+ an input image and writes a new image.
+ Relies on the ACES ctlrender command
Parameters
----------
- parameter : type
- Parameter description.
+ input_image : str or unicode
+ The path to the image to transform using the CTL files
+ output_image : str or unicode
+ The path to write the result of the transforms
+ ctl_paths : array of str or unicode, optional
+ The path to write the result of the transforms
+ input_scale : float, optional
+ The argument to the ctlrender -input_scale parameter
+ For images with integer bit depths, this divides image code values
+ before they are sent to the ctl commands
+ For images with float or half bit depths, this multiplies image code
+ values before they are sent to the ctl commands
+ output_scale : float, optional
+ The argument to the ctlrender -output_scale parameter
+ For images with integer bit depths, this multiplies image code values
+ before they are written to a file.
+ For images with float or half bit depths, this divides image code values
+ before they are sent to the ctl commands
+ global_params : dict of key value pairs, optional
+ The set of parameter names and values to pass to the ctlrender
+ -global_param1 parameter
+ aces_ctl_directory : str or unicode, optional
+ The path to the aces 'transforms/ctl/utilities'
Returns
-------
- type
- Return value description.
+ None
"""
if ctl_paths is None:
if len(ctl_paths) > 0:
ctlenv = os.environ
+
+ if "/usr/local/bin" not in ctlenv['PATH'].split(':'):
+ ctlenv['PATH'] = "%s:/usr/local/bin" % ctlenv['PATH']
+
if aces_ctl_directory is not None:
if os.path.split(aces_ctl_directory)[1] != 'utilities':
ctl_module_path = os.path.join(aces_ctl_directory, 'utilities')
def convert_bit_depth(input_image, output_image, depth):
"""
- Object description.
+ Convert the input image to the specified bit depth and write a new image
+ Relies on the OIIO oiiotool command
Parameters
----------
- parameter : type
- Parameter description.
+ input_image : str or unicode
+ The path to the image to transform using the CTL files
+ output_image : str or unicode
+ The path to write the result of the transforms
+ depth : str or unicode
+ The bit depth of the output image
+ Data types include: uint8, sint8, uint10, uint12, uint16, sint16, half, float, double
Returns
-------
- type
- Return value description.
+ None
"""
args = [input_image,
def generate_1d_LUT_from_CTL(lut_path,
ctl_paths,
lut_resolution=1024,
- identity_LUT_bit_depth='half',
+ identity_lut_bit_depth='half',
input_scale=1,
output_scale=1,
global_params=None,
channels=3,
format='spi1d'):
"""
- Object description.
+ Creates a 1D LUT from the specified CTL files by creating a 1D LUT image,
+ applying the CTL files and then extracting and writing a LUT based on the
+ resulting image
Parameters
----------
- parameter : type
- Parameter description.
+ lut_path : str or unicode
+ The path to write the 1D LUT
+ ctl_paths : array of str or unicode
+ The CTL files to apply
+ lut_resolution : int, optional
+ The resolution of the 1D LUT to generate
+ identity_lut_bit_depth : string, optional
+ The bit depth to use for the intermediate 1D LUT image
+ input_scale : float, optional
+ The argument to the ctlrender -input_scale parameter
+ For images with integer bit depths, this divides image code values
+ before they are sent to the ctl commands
+ For images with float or half bit depths, this multiplies image code
+ values before they are sent to the ctl commands
+ output_scale : float, optional
+ The argument to the ctlrender -output_scale parameter
+ For images with integer bit depths, this multiplies image code values
+ before they are written to a file.
+ For images with float or half bit depths, this divides image code values
+ before they are sent to the ctl commands
+ global_params : dict of key, value pairs, optional
+ The set of parameter names and values to pass to the ctlrender
+ -global_param1 parameter
+ cleanup : bool, optional
+ Whether or not to clean up the intermediate images
+ aces_ctl_directory : str or unicode, optional
+ The path to the aces 'transforms/ctl/utilities'
+ min_value : float, optional
+ The minimum value to consider as input to the LUT
+ max_value : float, optional
+ The maximum value to consider as input to the LUT
+ channels : int, optional
+ The number of channels to use for the LUT. 1 or 3 are valid.
+ format : str or unicode, optional
+ The format to use when writing the LUT
Returns
-------
- type
- Return value description.
+ None
"""
if global_params is None:
lut_path_base = os.path.splitext(lut_path)[0]
- identity_LUT_image_float = '%s.%s.%s' % (lut_path_base, 'float', 'tiff')
- generate_1d_LUT_image(identity_LUT_image_float,
+ identity_lut_image_float = '%s.%s.%s' % (lut_path_base, 'float', 'tiff')
+ generate_1d_LUT_image(identity_lut_image_float,
lut_resolution,
min_value,
max_value)
- if identity_LUT_bit_depth not in ['half', 'float']:
- identity_LUT_image = '%s.%s.%s' % (lut_path_base, 'uint16', 'tiff')
- convert_bit_depth(identity_LUT_image_float,
- identity_LUT_image,
- identity_LUT_bit_depth)
+ if identity_lut_bit_depth not in ['half', 'float']:
+ identity_lut_image = '%s.%s.%s' % (lut_path_base, 'uint16', 'tiff')
+ convert_bit_depth(identity_lut_image_float,
+ identity_lut_image,
+ identity_lut_bit_depth)
else:
- identity_LUT_image = identity_LUT_image_float
+ identity_lut_image = identity_lut_image_float
- transformed_LUT_image = '%s.%s.%s' % (lut_path_base, 'transformed', 'exr')
- apply_CTL_to_image(identity_LUT_image,
- transformed_LUT_image,
+ transformed_lut_image = '%s.%s.%s' % (lut_path_base, 'transformed', 'exr')
+ apply_CTL_to_image(identity_lut_image,
+ transformed_lut_image,
ctl_paths,
input_scale,
output_scale,
global_params,
aces_ctl_directory)
- generate_1d_LUT_from_image(transformed_LUT_image,
+ generate_1d_LUT_from_image(transformed_lut_image,
lut_path,
min_value,
max_value,
format)
if cleanup:
- os.remove(identity_LUT_image)
- if identity_LUT_image != identity_LUT_image_float:
- os.remove(identity_LUT_image_float)
- os.remove(transformed_LUT_image)
+ os.remove(identity_lut_image)
+ if identity_lut_image != identity_lut_image_float:
+ os.remove(identity_lut_image_float)
+ os.remove(transformed_lut_image)
-def correct_LUT_image(transformed_LUT_image,
- corrected_LUT_image,
+def correct_LUT_image(transformed_lut_image,
+ corrected_lut_image,
lut_resolution):
"""
- Object description.
+ For some combinations of resolution and bit depth, ctlrender would generate
+ images with the right number of pixels but with the values for width and
+ height transposed. This function generating a new, corrected image based on
+ the original. The function acts as a pass through if the problem is not
+ detected.
Parameters
----------
- parameter : type
- Parameter description.
+ transformed_lut_image : str or unicode
+ The path to an image generated by cltrender
+ corrected_lut_image : str or unicode
+ The path to an 'corrected' image to be generated
+ lut_resolution : int
+ The resolution of the 3D LUT that should be contained in
+ transformed_lut_image
Returns
-------
- type
- Return value description.
+ str or unicode
+ The path to the corrected image, or the original, if no correction was
+ needed.
"""
- transformed = oiio.ImageInput.open(transformed_LUT_image)
+ transformed = oiio.ImageInput.open(transformed_lut_image)
transformed_spec = transformed.spec()
width = transformed_spec.width
height,
lut_resolution * lut_resolution,
lut_resolution))
- print('Generating %s' % corrected_LUT_image)
+ print('Generating %s' % corrected_lut_image)
# Forcibly read data as float, the Python API doesn't handle half-float
# well yet.
type = oiio.FLOAT
source_data = transformed.read_image(type)
- correct = oiio.ImageOutput.create(corrected_LUT_image)
+ correct = oiio.ImageOutput.create(corrected_lut_image)
correct_spec = oiio.ImageSpec()
correct_spec.set_format(oiio.FLOAT)
correct_spec.height = width
correct_spec.nchannels = channels
- correct.open(corrected_LUT_image, correct_spec, oiio.Create)
+ correct.open(corrected_lut_image, correct_spec, oiio.Create)
dest_data = array.array('f',
('\0' * correct_spec.width *
correct.close()
else:
# shutil.copy(transformedLUTImage, correctedLUTImage)
- corrected_LUT_image = transformed_LUT_image
+ corrected_lut_image = transformed_lut_image
transformed.close()
- return corrected_LUT_image
+ return corrected_lut_image
def generate_3d_LUT_from_CTL(lut_path,
ctl_paths,
lut_resolution=64,
- identity_LUT_bit_depth='half',
+ identity_lut_bit_depth='half',
input_scale=1,
output_scale=1,
global_params=None,
aces_ctl_directory=None,
format='spi3d'):
"""
- Object description.
+ Creates a 3D LUT from the specified CTL files by creating a 3D LUT image,
+ applying the CTL files and then extracting and writing a LUT based on the
+ resulting image
Parameters
----------
- parameter : type
- Parameter description.
+ lut_path : str or unicode
+ The path to write the 1D LUT
+ ctl_paths : array of str or unicode
+ The CTL files to apply
+ lut_resolution : int, optional
+ The resolution of the 1D LUT to generate
+ identity_lut_bit_depth : string, optional
+ The bit depth to use for the intermediate 1D LUT image
+ input_scale : float, optional
+ The argument to the ctlrender -input_scale parameter
+ For images with integer bit depths, this divides image code values
+ before they are sent to the ctl commands
+ For images with float or half bit depths, this multiplies image code
+ values before they are sent to the ctl commands
+ output_scale : float, optional
+ The argument to the ctlrender -output_scale parameter
+ For images with integer bit depths, this multiplies image code values
+ before they are written to a file.
+ For images with float or half bit depths, this divides image code values
+ before they are sent to the ctl commands
+ global_params : dict of key, value pairs, optional
+ The set of parameter names and values to pass to the ctlrender
+ -global_param1 parameter
+ cleanup : bool, optional
+ Whether or not to clean up the intermediate images
+ aces_ctl_directory : str or unicode, optional
+ The path to the aces 'transforms/ctl/utilities'
+ format : str or unicode, optional
+ The format to use when writing the LUT
Returns
-------
- type
- Return value description.
+ None
"""
if global_params is None:
lut_path_base = os.path.splitext(lut_path)[0]
- identity_LUT_image_float = '%s.%s.%s' % (lut_path_base, 'float', 'tiff')
- generate_3d_LUT_image(identity_LUT_image_float, lut_resolution)
+ identity_lut_image_float = '%s.%s.%s' % (lut_path_base, 'float', 'tiff')
+ generate_3d_LUT_image(identity_lut_image_float, lut_resolution)
- if identity_LUT_bit_depth not in ['half', 'float']:
- identity_LUT_image = '%s.%s.%s' % (lut_path_base,
- identity_LUT_bit_depth,
+ if identity_lut_bit_depth not in ['half', 'float']:
+ identity_lut_image = '%s.%s.%s' % (lut_path_base,
+ identity_lut_bit_depth,
'tiff')
- convert_bit_depth(identity_LUT_image_float,
- identity_LUT_image,
- identity_LUT_bit_depth)
+ convert_bit_depth(identity_lut_image_float,
+ identity_lut_image,
+ identity_lut_bit_depth)
else:
- identity_LUT_image = identity_LUT_image_float
+ identity_lut_image = identity_lut_image_float
- transformed_LUT_image = '%s.%s.%s' % (lut_path_base, 'transformed', 'exr')
- apply_CTL_to_image(identity_LUT_image,
- transformed_LUT_image,
+ transformed_lut_image = '%s.%s.%s' % (lut_path_base, 'transformed', 'exr')
+ apply_CTL_to_image(identity_lut_image,
+ transformed_lut_image,
ctl_paths,
input_scale,
output_scale,
global_params,
aces_ctl_directory)
- corrected_LUT_image = '%s.%s.%s' % (lut_path_base, 'correct', 'exr')
- corrected_LUT_image = correct_LUT_image(transformed_LUT_image,
- corrected_LUT_image,
+ corrected_lut_image = '%s.%s.%s' % (lut_path_base, 'correct', 'exr')
+ corrected_lut_image = correct_LUT_image(transformed_lut_image,
+ corrected_lut_image,
lut_resolution)
- generate_3d_LUT_from_image(corrected_LUT_image,
- lut_path,
- lut_resolution,
+ generate_3d_LUT_from_image(corrected_lut_image,
+ lut_path,
+ lut_resolution,
format)
if cleanup:
- os.remove(identity_LUT_image)
- if identity_LUT_image != identity_LUT_image_float:
- os.remove(identity_LUT_image_float)
- os.remove(transformed_LUT_image)
- if corrected_LUT_image != transformed_LUT_image:
- os.remove(corrected_LUT_image)
+ os.remove(identity_lut_image)
+ if identity_lut_image != identity_lut_image_float:
+ os.remove(identity_lut_image_float)
+ os.remove(transformed_lut_image)
+ if corrected_lut_image != transformed_lut_image:
+ os.remove(corrected_lut_image)
if format != 'spi3d':
lut_path_spi3d = '%s.%s' % (lut_path, 'spi3d')
os.remove(lut_path_spi3d)
+
def main():
"""
- Object description.
+ A simple main that allows the user to exercise the various functions
+ defined in this file
Parameters
----------
- parameter : type
- Parameter description.
+ None
Returns
-------
- type
- Return value description.
+ None
"""
import optparse
for param in options.ctlRenderParam:
params[param[0]] = float(param[1])
- try:
- args_start = sys.argv.index('--') + 1
- args = sys.argv[args_start:]
- except:
- args_start = len(sys.argv) + 1
- args = []
-
if generate_1d:
print('1D LUT generation options')
else:
print('3D LUT generation options')
- print('lut : %s' % lut)
- print('format : %s' % format)
- print('ctls : %s' % ctls)
- print('lut res 1d : %s' % lut_resolution_1d)
- print('lut res 3d : %s' % lut_resolution_3d)
- print('min value : %s' % min_value)
- print('max value : %s' % max_value)
- print('input scale : %s' % input_scale)
- print('output scale : %s' % output_scale)
- print('ctl render params : %s' % params)
- print('ctl release path : %s' % ctl_release_path)
- print('bit depth of input : %s' % bit_depth)
- print('cleanup temp images : %s' % cleanup)
+ print('LUT : %s' % lut)
+ print('Format : %s' % format)
+ print('CTLs : %s' % ctls)
+ print('LUT Res 1d : %s' % lut_resolution_1d)
+ print('LUT Res 3d : %s' % lut_resolution_3d)
+ print('Min Value : %s' % min_value)
+ print('Max Value : %s' % max_value)
+ print('Input Scale : %s' % input_scale)
+ print('Output Scale : %s' % output_scale)
+ print('CTL Render Params : %s' % params)
+ print('CTL Release Path : %s' % ctl_release_path)
+ print('Input Bit Depth : %s' % bit_depth)
+ print('Cleanup Temp Images : %s' % cleanup)
if generate_1d:
generate_1d_LUT_from_CTL(lut,
ctl_release_path,
format=format)
else:
- print(('\n\nNo LUT generated. '
+ print(('\n\nNo LUT generated! '
'You must choose either 1D or 3D LUT generation\n\n'))
if __name__ == '__main__':
main()
-